Чтение и запись изображения 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)

Как я могу решить эту проблему?

Ответы

Ответ 1

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

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

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

Если вы не можете использовать JAI ImageIO по какой-то причине, вы можете заставить его работать с вашим существующим кодом, но вам нужно будет сделать дополнительную работу. Модель цвета, создаваемая для TIFF, которую вы загружаете, вероятно, является индексированной цветовой моделью, которая не поддерживается BMP. Вы можете заменить его на операцию JAI.create( "format",...), предоставив подсказку рендеринга с ключом 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() могут быть утончены, чтобы дать вам что вы хотите.

Ответ 2

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