2010-05-24 2 views
13

Я попытался следующий код, чтобы выполнить задачу чтения и записи TIFF изображений:Чтение и запись из TIFF изображения в 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); 

Однако, когда я запускаю код, я получаю следующее сообщение об ошибке:

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) 

Любая идея, как я мог бы решить эту проблему?

ответ

20

Самый простой способ чтения в TIFF и вывода BMP будет использовать класс ImageIO:

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

Единственная дополнительная вещь, которую вы должны сделать, чтобы получить эту работу, это убедиться, что вы» я добавил JAI ImageIO JARs в ваш путь к классам, поскольку BMP и TIFF не обрабатываются JRE без плагинов из этой библиотеки.

Если вы не можете использовать JAI ImageIO по какой-либо причине, вы можете заставить его работать с существующим кодом, но вам придется выполнить дополнительную работу. Модель цвета, создаваемая для TIFF, которую вы загружаете, вероятно, является индексированной цветовой моделью, которая не поддерживается BMP. Вы можете заменить его на JAI.create («формат», ...), предоставив подсказку рендеринга с ключом JAI.KEY_REPLACE_INDEX_COLOR_MODEL.

Вы можете иметь некоторые удачи записи образа чтения из файла во временный изображение, а затем выписывая временный файл:

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

Я интересно, если вы работаете в той же цветовой индекс модели выпуска как с обычным JAI. В идеале вы должны использовать класс ImageIO для получения экземпляров ImageReader и ImageWriter для всех, кроме самых простых случаев, чтобы вы могли настроить параметры чтения и записи соответственно, но ImageIO.read() и .write() могут быть утончены, чтобы дать вам что ты хочешь.

+0

"ImageIO.write (изображение, "ВМР", новый файл (файл_вывод))" жесток не позволяющий успешно записывать изображение в виде файла «.bmp». когда вместо этого меняю код на «.tiff», тогда он будет работать. – user224270

+0

извините ... была небольшая опечатка. Теперь ImageIO.write должен выписывать convertImage, а не исходное изображение. – Jeff

+0

Спасибо, Джефф. это сработало! вы действительно спасли мой день;) – 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()); 

Используйте это содержимое (то есть значение "tiffEncodedImg") в качестве Src значения IMG тега в HTML

Смежные вопросы