Frage

Mein Lehrer schickte mir diesen Code, die angeblich ein integraler Bestandteil eines laufenden Projekts sein. Das Ding ist, es funktioniert nicht.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.Kernel;
import java.awt.image.ConvolveOp;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import javax.swing.*;


public class ImageUtil {

    public static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException{

        if(quality <0||quality>1){
            throw new IllegalArgumentException ("quality has to be between 0 and 1");

        }

        ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
        Image i = ii.getImage();
        Image resizedImage = null;

        int iWidth = i.getWidth (null);
        int iHeight = i.getHeight(null);

        if (iWidth > iHeight){
            resizedImage = i.getScaledInstance(newWidth,(newWidth*iHeight)/iWidth, Image.SCALE_SMOOTH);
        } else {
            resizedImage = i.getScaledInstance((newWidth*iWidth)/iHeight,newWidth, Image.SCALE_SMOOTH);
        }

        Image temp = new ImageIcon (resizedImage).getImage();

        BufferedImage bufferedImage = new BufferedImage (temp.getWidth(null), temp.getHeight(null),
                                                         BufferedImage.TYPE_INT_RGB);

        // copy to a buffered image
        Graphics g = bufferedImage.createGraphics();

        g.setColor(Color.white);
        g.fillRect(0,0,temp.getWidth(null), temp.getHeight(null)); // causea el error de ejecución?
        g.drawImage(temp,0,0,null);
        g.dispose();

        float softenFactor = 0.05f;
        float [] softenArray = {0, softenFactor,0, softenFactor, 1-(softenFactor*4), softenFactor,0, softenFactor,0};
        Kernel kernel = new Kernel (3,3,softenArray);
        ConvolveOp cOp = new ConvolveOp (kernel, ConvolveOp.EDGE_NO_OP,null);
        bufferedImage = cOp.filter (bufferedImage,null);

        FileOutputStream out = new FileOutputStream(resizedFile);

        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);

        param.setQuality(quality,true);

        encoder.setJPEGEncodeParam(param);
        encoder.encode(bufferedImage);



    }

    public static void main(String args[]) throws IOException {
       File originalImage= new File ("/images/goya.jpg");
       resize(originalImage,new File("/images/goyanuevotamanio.jpg"),350, 0.2f);
       resize(originalImage, new File("/images/goyanuevotamanio.jpg"), 350, 1f);

    }

}

Er sagt, der Code sollte in der Lage sein, sowohl die Höhe, um die Größe und doch seine Größe ändert Methode Breite:

public static void resize(File originalFile, File resizedFile, int newWidth, float quality)

fehlt ein newHeight Parameter.

Die Runtime, die ausgelöst hat, sagt:

Exception in thread "main" java.lang.IllegalArgumentException: **Width (-1) and height (-1) cannot be <= 0**
        at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:999)
        at java.awt.image.BufferedImage.<init>(BufferedImage.java:312)
        at ImageUtil.resize(ImageUtil.java:38)
        at ImageUtil.main(ImageUtil.java:72)
Java Result: 1

Wie kann ich das ändern?

War es hilfreich?

Lösung

Ohne den Code zu analysieren, um zu sehen, was das Problem sein könnte, kann ich sagen, dass, wenn die Absicht, das Bilder Seitenverhältnis zu halten, ist ein neuer Höhenparameter nicht benötigt wird. Es wird immer ein festes Verhältnis der Breite sein.

UPDATE:

Ich habe den Code gegen meine eigene Testbild laufen und es in der Tat wie erwartet funktioniert. Der Fehler, den Sie bekommen wird höchstwahrscheinlich verursacht wird, wenn das Programm nicht das Quellbild finden Sie angeben. Ich bekomme die gleichen Fehler, wenn ich ein Quellenbild angeben, das nicht existiert.

Versuchen Sie einen absoluten Pfad (einschließlich Laufwerksbuchstaben usw.) für Ihre Quellbild.

UPDATE 2

Fügen Sie den folgenden Code nach der Zeile ..

ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());

if(ii.getImageLoadStatus() == MediaTracker.COMPLETE)
{
    System.out.print("Load image ok\n");
}
else
{
    System.out.print("Load image failed\n");
}

Dies wird Ihnen sagen, wenn das Programm fehlschlägt das Quellbild zu laden.

Andere Tipps

Warum Sie erweichen anwenden, um die Größe es muss sein sharpen Kernal -1 -2 -1 -2 12 + q -2 -1 -2 -1 wobei ein tipical q 28 sein könnte, und Sie sind applyng nicht die Resize-Version drawImage

(q = 36 ist äquivalent zu Ihrer F = 0,05 für Schärfen)

Gemessen an der Stack-Trace die Ausnahme von dieser Linie geworfen wird:

BufferedImage bufferedImage = new BufferedImage (temp.getWidth(null), temp.getHeight(null), BufferedImage.TYPE_INT_RGB);

Ich würde denken, dies ist wahrscheinlich, weil temp.getWidth und temp.getHeight zurückkehren -1, da das Bild nicht fertig geladen hat.

Es gibt Anleitungen und Beispiele für mit Bildern in Java zur Verfügung, die im Internet zu arbeiten. Eine Probe ist hier http://snippets.dzone.com/posts/show/92. Suchen Sie nach dem Code ImageObserver.

Sie haben das Programm einen Startparameter zwischen 0 und 1 zu geben. Ich habe es getan und es funktioniert perfekt.

anpassen folgt aus:

private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double srcWidth = img.Source.Width;
    double srcHeight = img.Source.Height;

    double resizeWidth = srcWidth;
    double resizeHeight = srcHeight;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top