Чтение и запись TIFF-изображения на Java - PullRequest
13 голосов
/ 24 мая 2010

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

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

Ответы [ 2 ]

22 голосов
/ 24 мая 2010

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

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

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

0 голосов
/ 08 октября 2013
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

...