wer hat erfahrung mit ImageIO ???
-
hallo zusammen,
ich möchte ein bild komprimiert auf platte abspeichern (Bild liegt als BufferedImage vor). das is mal so meine grundmotivation. da das package das ich dafür benutze möglichst viele kompressionsalgorithmen kennen sollte, hab ich mir nach einigem hin- und her mich ImageIO angenommen, daß ja seit version 1.4.0 im sdk enthalten is und von sun als ultimative lösung angepriesen wird, die von nun an für soetwas da sein sollte. leider hab ich nun ein problem, daß die mangelhafte doku von ImageIO auch nicht zu lösen weiß. das problem sitzt schon in etwas code drinnen, den ich aber möglicherweise gar nicht brauch, also wenn wer ne idee hat, ein bild komprimiert zu speichern mit einem wählbaren kompressionsalgorithmus, dann würd ich das gern hören. ansonsten: hier mein problem mit code:
public static int saveImage(BufferedImage bi, String path, String suffix, String compressionType, int compressionMode, float compressionQuality) throws IOException { File outputFile = new File(path); ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile); ImageWriter writer = getWriterForSuffix(suffix); IIOImage img = new IIOImage(bi,null,null); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode( compressionMode); param.setCompressionType( compressionType); param.setCompressionQuality(compressionQuality); writer.setOutput(ios); writer.write(img.getMetadata(),img,param); // <-- PROBLEM return 0; } private static ImageWriter getWriterForSuffix(String suffix){ ImageWriter writer = null; Iterator iter = ImageIO.getImageWritersBySuffix(suffix); if (iter.hasNext()) { writer = (ImageWriter) iter.next(); } else { System.out.println("Fehler: Suffix unbekannt!"); return null; } return writer; }
mein problem sitzt in der ersten methode (saveImage) in der vorletzten zeile. wenn ich das so ausführe, bekomme ich folgenden laufzeitfehler:
java.lang.IllegalStateException: Output has not been set!
das output hab ich aber in der zeile darüber gesetzt und auch schon darauf überprüft, ob der outputstream nach dem setzten in dem writer (oder ob irgendein anderes beteiligtes objekt) null ist ... das ist nicht der fall. wenn ich das letzte parameter durch null ersetzte, funktioniert der aufruf (leider aber natürlich mit unkomprimierten ergebnisbildern).
ist dies eigentlich die einzige möglichkeit ImageIO zu beschreiben, wie es ein bild beim abspeichern zu komprimieren hat?
wenn noch was unklar ist, dann fragt ruhig ... ich bin heut noch ein wenig da und warte sehnsüchtig auf erleuchtung
-
Reicht dir das in der Art, wie es in folgendem Converter genutzt wird?
[java]
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.image.BufferedImage;public class ImageConverter
{public static void main(String[] args)
{
if (args.length != 3)
{
System.out.println ("Falsche Nutzung!");
System.out.println ("Nutzung :");
System.out.println ("java ImageConverter Quelldatei Zieldatei Format");
System.out.println ("Format : png oder jpg");
System.exit(1);
}
try
{
BufferedImage image = ImageIO.read(new File (args[0]));
if (image == null)
{
System.out.println ("Konnte Bild nicht dekodieren!");
System.exit(1);
}
if (ImageIO.write(image,args[2],new File (args[1])) == false)
{
System.out.println ("Unbekanntes Zielformat");
System.exit(1);
}
}
catch (IOException e)
{
System.out.println ("Fehler beim Laden oder Speichern!");
System.exit(1);
}
}
}[/code]
-
danke erst mal für die schnelle antwort. reichen tut mir aber ImageIO.write(...) nicht, da man nicht einstellen kann, wie der kompressionsalgorithmus codieren soll. also beispielsweise ob das jpg progressiv komprimiert werden soll oder in welcher qualität komprimiert wird. ausprobiert hatte ich ImageIO.write(...) auch schon, aber hab es als unzureichend abgetan. ausserdem hat ImageIO.write(...) keinerlei möglichkeiten um ein multitiff (mehrere bilder in einem tiff file) abzuspeichern, was später als erweiterung in meinen code noch aufgenommen wird.
danke aber trotzdem erstmal
wayne
-
Cengiz du bist ja echt cool.
-
Zu dumm dass man mit Java halt immer noch programmieren muss gell? .....
-
blubb
-
-
auf euch beide helden hat das forum nur noch gewartet ... wenn einer keine ahnung hat schreibt er lieber irgendeinen scheiß der keinen interessiert als gar nichts. echt klasse, vor allem für die leute, die hilfe brauchen und auf ne brauchbare antwort hoffen. hey jungs ... wenn ihr chatten wollt, dann zieht euch doch icq, mirc oder aim
-
@wayne: Jetzt mal langsam. Erst nachdenken dann Mund einschalten. Meinem Beitrag fehlt es wohl noch an Ironie-Tags, was? Ts ts ts...
-
vielleicht bin ich ungebildet, aber mir war nicht so, also ob "blubb" irgendetwas ironisches aussagen sollte. ich kam aber eigentlich auch nicht in dieses forum um mich mit ironie unterhalten zu lassen sondern um nicht nochmal weitere 5 stunden an der selben zeile code zu sitzen
-
Verfolge deinen Thread noch einmal und versuche dann zu erfahren wofür "blubb" gestanden hat - Danke!