2010-05-24 8 views
13

j'ai essayé le code suivant pour accomplir la tâche de lecture et d'écriture des images TIFF:Lecture et écriture sur l'image TIFF en 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); 

Cependant, quand je lance le code, je reçois le message d'erreur suivant:

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) 

Une idée comment je pourrais résoudre ce problème?

Répondre

20

La meilleure façon de lire dans un fichier TIFF et la sortie d'un BMP serait d'utiliser la classe ImageIO:

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

La seule chose supplémentaire que vous devez faire pour obtenir ce travail est assurez-vous » J'ai ajouté les JAR JAI ImageIO à votre classpath, car BMP et TIFF ne sont pas gérés par le JRE sans les plugins de cette bibliothèque.

Si vous ne pouvez pas utiliser JAI ImageIO pour une raison quelconque, vous pouvez l'utiliser avec votre code existant, mais vous devrez effectuer un travail supplémentaire. Le modèle de couleur créé pour le TIFF que vous chargez est probablement un modèle de couleur indexé qui n'est pas pris en charge par un BMP. Vous pouvez le remplacer par l'opération JAI.create ("format", ...) en fournissant un indice de rendu avec une clé de JAI.KEY_REPLACE_INDEX_COLOR_MODEL.

Vous pouvez avoir une chance d'écrire l'image lue à partir du fichier dans une image temporaire, puis d'écrire sur l'image temporaire:

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

Je me demande si vous êtes en cours d'exécution dans le même numéro de modèle de couleur d'index comme avec le JAI régulier. Idéalement, vous devriez utiliser la classe ImageIO pour obtenir les instances ImageReader et ImageWriter pour tous les cas, sauf les plus simples, afin de pouvoir ajuster les paramètres de lecture et d'écriture en conséquence, mais ImageIO.read() et .write() peuvent être affinés pour vous donner ce que tu veux.

+0

"ImageIO.write (image, "bmp", nouveau fichier (outputFile))" est rigide non écriture capable d'écrire avec succès l'image comme un fichier ".bmp". lorsque je change le code en ".tiff" à la place, alors ça va marcher. – user224270

+0

désolé ... il y avait une petite faute de frappe. ImageIO.write devrait maintenant écrire l'image convertie, pas l'image originale. – Jeff

+0

Merci Jeff. ça a marché! vous avez vraiment sauvé ma journée;) – 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()); 

Utilisez ce contenu (ie valeur de "tiffEncodedImg") en tant que valeur src de la balise img dans HTML