2009-04-19 5 views
0

Mein Lehrer schickte mir diesen Code, der ein integraler Bestandteil eines laufenden Projekts sein soll. Sache ist, es funktioniert nicht.Dieser Code für Bild resize() Arbeit machen

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 in der Lage sein sollte, um die Höhe, um die Größe und doch seine Größe ändern 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?

+0

Welche Parameter verwendet werden, wenn resize genannt wird? –

+0

Größe ändern (originalImage, neue Datei ("/ images/goyanuevotamanio.jpg "), 350, 0.2f); – andandandand

+0

oops, ich hätte das weiter unten sehen sollen :) Wenn du sicher bist, dass es keine Probleme mit /images/goya.jpg gibt, dann muss ich das eigentlich laufen lassen Weitere Hilfe Ich werde sehen, was ich tun kann. –

Antwort

1

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

UPDATE:

ich den Code gegen meine eigenen Testbild ausgeführt haben und es in der Tat wie erwartet funktioniert. Der Fehler, den Sie erhalten, wird höchstwahrscheinlich verursacht, wenn das Programm das von Ihnen angegebene Quellbild nicht finden kann. Ich bekomme denselben Fehler, wenn ich ein Quellbild anwähle, das nicht existiert.

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

UPDATE 2

den folgenden Code nach der Zeile hinzu ..

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 das Quellbild zu laden versagt.

+0

Warum beschwert sich die Ausnahme über den Höhenwert? – andandandand

+0

Das müssen wir herausfinden. Ein Bild hat eine Höhe, eine Größenänderungsfunktion muss jedoch keinen Höhenparameter angeben, wenn das Seitenverhältnis beibehalten werden soll und eine neue Breite bereitgestellt wird –

+0

Der in der Ausnahme erwähnte height-Parameter ist, glaube ich, temp.getHeight (null) was ist an neue BufferedImage übergeben –

0

durch den Stapel zu urteilen die Ausnahme verfolgen wird durch diese Linie geworfen:

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, weil das Bild noch nicht fertig geladen hat.

Es gibt Tutorials und Beispiele für die Arbeit mit Bildern in Java im Internet verfügbar. Eine Probe ist hier http://snippets.dzone.com/posts/show/92. Suchen Sie den Code mit ImageObserver.

0

Sie müssen dem Programm einen Startparameter zwischen 0 und 1 geben. Ich habe es getan und es funktioniert perfekt.

0

diese anzupassen:

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

Warum Sie erweichen anwenden, um die Größe es schärfen sein müssen Kernal -1 -2 -1 -2 12 + q -2 -1 -2 -1, wo ein tipical q konnte sein 28 und Sie sind applyng nicht die resize-Version von drawImage

(q = 36 entspricht Ihre F = 0,05 für sharpen)