Чтение и изображение в формате 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)

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

13
задан Jeff 24 May 2010 в 16:21
поделиться

1 ответ

Самый простой способ прочитать 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 () можно усовершенствовать, чтобы дать вам что ты хочешь.

22
ответ дан 1 December 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: