Чтение и запись изображения TIFF в Java

Я попробовал следующий код для выполнения задачи чтения и записи изображений в формате TIFF:

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

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


person user224270    schedule 24.05.2010    source источник


Ответы (2)


Самый простой способ прочитать TIFF и вывести BMP - это использовать класс ImageIO:

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

Единственное, что вам нужно сделать, чтобы это заработало, - это убедиться, что вы добавили JAR-файлы JAI ImageIO в свой путь к классам, поскольку 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 () можно усовершенствовать, чтобы дать вам что вы хотите.

person Jeff    schedule 24.05.2010
comment
ImageIO.write (image, bmp, new File (outputFile)) жестко не записывает, не может успешно записать изображение как файл .bmp. когда я вместо этого поменяю код на .tiff, он будет работать. - person user224270; 24.05.2010
comment
извините ... произошла небольшая опечатка. ImageIO.write теперь должен записывать преобразованное изображение, а не исходное изображение. - person Jeff; 24.05.2010
comment
Совет, убедитесь, что вы добавили JAI ImageIO JAR в свой путь к классам, абсолютно спас мне сегодня рассудок! Спасибо. - person Stewart; 17.05.2012
comment
Альтернативой JAI является TwelveMonkeys ImageIO, как предлагается в этом вопросе (руководство по установке). Тогда вы можете просто использовать ImageIO.read как обычно. Никаких родных библиотек, как в случае с JAI, не требуется. - person Will Hardwick-Smith; 09.08.2016
comment
ImageIO.read поддерживает файлы TIFF, начиная с Java 9, без дополнительных библиотек. - person Hemaolle; 14.04.2018

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.

person SamVish    schedule 08.10.2013