Напишите плиточный вывод TIFF, используя ImageIO в Java

То, что у меня есть, - это большое количество кадров, которые нужно разместить вместе в большом изображении (например, в мозаике). Требуемые положения изображений известны.

Существует очень большое количество изображений, поэтому загрузка их всех в память в лучшем случае нецелесообразна.

Основываясь на некоторых других ответах, я смог переопределить методы в RenderedImage (в частности, getData(rect)) загрузить соответствующие данные и вернуть их.

Это работает очень хорошо, однако автор изображений всегда вызывает getData и запрашивая строки данных. Мне кажется, что я должен иметь возможность изменить ImageWriterParam для вызова отдельных плиток, но когда я попробовал, функция записи по-прежнему вызывает одну строку из getData,

Как я могу заставить это использовать плитки и вызвать вместо них getTile.

BufferedOutputStream bos=null;
try {
   bos = new BufferedOutputStream(new FileOutputStream(new File("test2.tiff")));

   ImageWriter writer =(ImageWriter) ImageIO.getImageWritersBySuffix("tif").next();

   ImageOutputStream ios=null

   ios = ImageIO.createImageOutputStream(bos); 

   writer.setOutput(ios);
   ImageWriteParam param = writer.getDefaultWriteParam();
   param.setTilingMode(ImageWriteParam.MODE_DEFAULT);

   RenderedImage mosaic = new MosaicImage(imageFiles[]);

   writer.write(null,new IIOImage(mosaic,null,null),param);

    } catch (FileNotFoundException ex) {

    }

Обратите внимание, я могу использовать param.setTilingMode(ImageWriteParam.MODE_EXPLICIT); а также setTiling(w,h,xoff,yoff);

Однако при использовании этого, writer.write все еще звонит getData(rect) в моем изображении, и очень досадно не требует прямоугольника размера, указанного w,h, Он вызывает прямоугольник размером, который отличается на некоторое случайное количество (вероятно, происходит от чего-то)

Например, если я использую setTiling(100,100,0,0);

можно было бы ожидать, что даже если он не вызывает getTile из изображения, Rectangle, переданный getData, должен быть (0,0,100,100), но вместо этого он передает Rectangle (0,0,96,96), который не кратен ширине изображения или что-нибудь еще, о чем я могу думать.

Спасибо за любую помощь

1 ответ

Решение

Если вы прочитали спецификацию TIFF 6.0 в полях TileWidth и TileLength, вы найдете текст

TileWidth должно быть кратным 16. Это ограничение повышает производительность в некоторых графических средах и улучшает совместимость со схемами сжатия, такими как JPEG.

И похоже на TileLength. 100x100 не делится на 16, но 96x96, что, я уверен, кодировщик TIFF старается удовлетворить ваш запрос.

Другие вопросы по тегам