Domanda

Il mio istruttore mi ha inviato questo codice, che dovrebbe essere parte integrante di un progetto in corso. Il fatto è che non funziona.

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);

    }

}

Si dice che il codice dovrebbe essere in grado di ridimensionare altezza e larghezza ma il suo metodo di ridimensionamento:

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

manca un parametro newHeight.

Il RuntimeException che è gettato dice:

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

Come faccio a cambiare questo?

È stato utile?

Soluzione

Senza analizzare il codice per vedere che cosa il problema potrebbe essere, posso dire che se l'intenzione è quella di mantenere il rapporto di immagini aspetto, un nuovo parametro di altezza non è necessario. Sarà sempre un rapporto fisso tra la larghezza.

UPDATE:

Ho eseguito il codice contro la mia immagine di prova proprio e che effettivamente funziona come previsto. L'errore che si stanno ottenendo è probabilmente causato quando il programma non riesce a trovare l'immagine di origine specificato. Ottengo lo stesso errore quando ho specificare un'immagine di origine che non esiste.

Prova ad utilizzare un percorso assoluto (compresa la lettera dell'unità, ecc) per la propria immagine originale.

UPDATE 2

Aggiungere il seguente codice dopo la linea ..

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");
}

Questo vi dirà se il programma non riesce a caricare l'immagine di origine.

Altri suggerimenti

Perché si applica ammorbidire per ridimensionarla deve essere affilare Kernal -1 -2 -1 -2 12 + q -2 -1 -2 -1 dove un q tipico potrebbe essere 28 e non si è applyng la versione di ridimensionamento di drawImage

(q = 36 è equivalente al vostro F = 0,05 per affinare)

A giudicare dallo stack tracciare l'eccezione viene generata da questa linea:

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

Vorrei che questo è probabilmente perché temp.getWidth e temp.getHeight stanno tornando -1 perché l'immagine non è terminato il caricamento.

Ci sono tutorial ed esempi per lavorare con immagini in Java disponibili sul web. Un campione è qui http://snippets.dzone.com/posts/show/92. Cercare il codice utilizzando ImageObserver.

Si deve dare al programma un parametro di partenza compreso tra 0 e 1. L'ho fatto e funziona perfettamente.

adattare questo:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top