Напишите плиточный вывод TIFF, используя ImageIO в Java - PullRequest
3 голосов
/ 02 августа 2011

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

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

Основываясь на некоторых других ответах, я смогпереопределите методы в 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 Ответ

3 голосов
/ 18 февраля 2012

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

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

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

...