2009-04-19 7 views
0

Mon instructeur m'a envoyé ce code, qui est censé faire partie intégrante d'un projet en cours. Chose est, cela ne fonctionne pas.Faire ce code pour l'image resize() travail

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 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?

+0

Quels sont les paramètres utilisés lors Resize est appelé? –

+0

redimensionner (originalImage, nouveau fichier ("/ images/goyanuevotamanio.jpg "), 350, 0.2f); – andandandand

+0

oups, j'aurais dû voir cela plus bas :) Si vous êtes sûr qu'il n'y a pas de problèmes avec /images/goya.jpg alors je vais devoir exécuter cela pour être de Je vais voir ce que je peux faire –

Répondre

1

Sans analyser le code pour voir quel pourrait être le problème, je peux dire que si l'intention est de conserver le format de l'image, un nouveau paramètre de hauteur n'est pas nécessaire. Ce 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 probablement due au fait que le programme ne trouve pas l'image source que vous avez spécifiée. Je reçois la même erreur lorsque je spécifie une image source qui n'existe pas. Essayez d'utiliser un chemin absolu (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.

+0

Pourquoi l'exception se plaint-elle de la valeur de hauteur passée alors? – andandandand

+0

C'est ce que nous avons besoin de savoir. mais une fonction de redimensionnement n'a pas besoin de spécifier un paramètre de hauteur si le ratio d'aspect doit être maintenu et une nouvelle largeur est fournie –

+0

Le paramètre height mentionné dans l'exception, je pense, est temp.getHeight (null) qui est en cours –

0

A en juger par la pile trace 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 c'est probablement parce que temp.getWidth et temp.getHeight reviennent -1 parce que l'image n'a pas fini de charger.

Il existe des didacticiels et des exemples d'utilisation des images en Java disponibles sur le Web. Un échantillon est ici http://snippets.dzone.com/posts/show/92. Recherchez le code en utilisant ImageObserver.

0

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

0

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; 
} 
1

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

(q = 36 est équivalent à votre F = 0,05 pour affûter)