Question

Mon instructeur m'a envoyé ce code, qui est censé faire partie intégrante d'un projet en cours. La chose est, il ne fonctionne pas.

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

    }

}

Il dit que le code devrait être en mesure de redimensionner la hauteur et la largeur encore sa méthode de modification de taille:

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

manque un paramètre de newHeight.

Le RuntimeException qui a jeté dit:

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

Comment puis-je changer cela?

Était-ce utile?

La solution

Sans analyser le code pour voir ce que le problème pourrait être, je peux dire que si l'intention est de maintenir le ratio d'aspect des images, un nouveau paramètre de hauteur n'est pas nécessaire. Il sera toujours un rapport fixe de la largeur.

Mise à jour:

J'ai couru le code contre ma propre image de test et il ne fonctionne en effet comme prévu. L'erreur que vous obtenez est très probablement causé lorsque le programme ne peut pas trouver l'image source que vous spécifiez. Je reçois la même erreur lorsque je spécifie une image source qui n'existe pas.

Essayez d'utiliser un chemin absolu (y compris la lettre de lecteur, etc.) pour votre image source.

MISE À JOUR 2

Ajoutez le code suivant après la ligne ..

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

Cela vous indiquera si le programme ne parvient pas à charger l'image source.

Autres conseils

Pourquoi vous appliquez ramollir la redimensionner doivent être affûter -1 -2 Kernal -1 -2 12 + q -2 -1 -2 -1 où q pourrait être 28 tipical et vous n'êtes pas applyng la version de redimensionnement drawImage

(q = 36 est équivalent à votre F = 0,05 pour aiguiser)

A en juger par la pile tracer l'exception est levée par cette ligne:

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

Je pense que cela est probablement parce que temp.getWidth et temp.getHeight reviennent -1 parce que l'image n'a pas fini de se charger.

Il y a des tutoriels et des exemples pour travailler avec des images en Java disponibles sur le web. Un échantillon est ici http://snippets.dzone.com/posts/show/92. Recherchez le code à l'aide ImageObserver.

Vous devez donner au programme un paramètre de départ entre 0 et 1. Je l'ai fait et ça marche parfaitement.

adapter ceci:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top