2010-05-24 11 views
13

Ich habe versucht, den folgenden Code die Aufgabe des Lesens und Schreibens TIFF-Bilder zu erreichen:Lesen und TIFF-Bild Schreiben heraus in Java

// Define the source and destination file names. 
String inputFile = /images/FarmHouse.tif 
String outputFile = /images/FarmHouse.bmp 

// Load the input image. 
RenderedOp src = JAI.create("fileload", inputFile); 

// Encode the file as a BMP image. 
FileOutputStream stream = 
    new FileOutputStream(outputFile); 
JAI.create("encode", src, stream, BMP, null); 

// Store the image in the BMP format. 
JAI.create("filestore", src, outputFile, BMP, null); 

Allerdings, wenn ich den Code ausführen, bekomme ich folgende Fehlermeldung:

Caused by: java.lang.IllegalArgumentException: Only images with either 1 or 3 bands 
can be written out as BMP files. 
at com.sun.media.jai.codecimpl.BMPImageEncoder.encode(BMPImageEncoder.java:123) 
at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79) 

Irgendeine Idee, wie ich dieses Problem lösen könnte?

Antwort

20

Der einfachste Weg, ein BMP wäre zu verwenden, um die ImageIO Klasse in einem TIFF und Ausgabe zu lesen:

BufferedImage image = ImageIO.read(inputFile); 
ImageIO.write(image, "bmp", new File(outputFile)); 

Das einzige zusätzliche, was Sie müßten dies tun, um Arbeit zu bekommen ist, stellen Sie sicher,‘ Wir haben die JAI ImageIO JARs zu Ihrem Klassenpfad hinzugefügt, da BMP und TIFF von der JRE ohne die Plugins aus dieser Bibliothek nicht behandelt werden.

Wenn Sie JAI ImageIO aus irgendeinem Grund nicht verwenden können, können Sie es mit Ihrem vorhandenen Code arbeiten, aber Sie müssen einige zusätzliche Arbeit erledigen. Das Farbmodell, das für das TIFF erstellt wird, das Sie laden, ist wahrscheinlich ein indiziertes Farbmodell, das von einem BMP nicht unterstützt wird. Sie können es durch die Operation JAI.create ("format", ...) ersetzen, indem Sie einen Rendering-Hinweis mit einem Schlüssel von JAI.KEY_REPLACE_INDEX_COLOR_MODEL angeben.

Sie können etwas Glück haben, das Bild Schreiben von Datei in ein temporäres Bild lesen und dann das temporäre Bild auszuzuschreiben:

BufferedImage image = ImageIO.read(inputFile); 
BufferedImage convertedImage = new BufferedImage(image.getWidth(), 
    image.getHeight(), BufferedImage.TYPE_INT_RGB); 
convertedImage.createGraphics().drawRenderedImage(image, null); 
ImageIO.write(convertedImage, "bmp", new File(outputFile)); 

Ich frage mich, wenn Sie in das gleiche Index-Farbmodell Problem laufen wie beim regulären JAI. Idealerweise sollten Sie die ImageIO-Klasse verwenden, um ImageReader- und ImageWriter-Instanzen für alle bis auf die einfachsten Fälle zu erhalten, so dass Sie die Lese- und Schreibparameter entsprechend anpassen können, aber die ImageIO.read() - und .write() -Funktionen können Sie übernehmen was du willst.

+0

"ImageIO.write (Bild, "bmp", neue Datei (output))" ist steif nicht Schreiben in der Lage, das Bild erfolgreich als ".bmp" -Datei zu schreiben. Wenn ich den Code stattdessen in ".tiff" ändere, wird es funktionieren. – user224270

+0

Entschuldigung ... es gab einen kleinen Tippfehler. Das ImageIO.write sollte nun das konvertierte Bild und nicht das Originalbild ausgeben. – Jeff

+0

Danke Jeff. es funktionierte! Sie haben wirklich meinen Tag gerettet;) – user224270

0
FileInputStream in = new FileInputStream(imgFullPath); 
FileChannel channel = in.getChannel(); 
ByteBuffer buffer = ByteBuffer.allocate((int)channel.size()); 
channel.read(buffer); 
tiffEncodedImg = Base64.encode(buffer.array()); 

verwenden Sie diesen Inhalt (dh Wert von "tiffEncodedImg") als src-Wert von img-Tag in HTML