2014-10-01 2 views
4

Допустим, у меня очень большое изображение TIFF в качестве входного сигнала. Я не могу полностью загрузить это изображение из-за спецификации памяти, которую я должен соблюдать. Таким образом, следующий не вариант:Как читать файл TIFF с помощью плитки с Java?

BufferedImage data = ImageIO.read(image); 

Есть ли библиотека Java позволяет читать определенную часть изображения без буферизации всего изображения? Или некоторые способы получить TIFF-плитки из потока?

ответ

6

ImageIO может предоставить вам ImageReader для Tiff, а затем вы можете использовать readTile. ImageIO имеет несколько методов getImageReadersBy....

Я не знаю, поддерживается ли TIFI ImageIO, но ImageIO использует java SPI, чтобы можно было подключать ImageReaders и ImageWriters.

Фактически это короткий отрезок для read с ImageReadParam, настроенный для плитки.

Никогда не использовала плитки, но, увидев предыдущий ответ, я хотел указать эту опцию.

+0

Я использовал плитки, но на другом языке, и никогда не реализовал API, размещал его напрямую, и я думал, что знаю API ... Хммм спасибо за урок. – rolfl

+0

@rolfl эй, я не знаю, есть ли поддержка tiff, может быть, через [JAI] (http://www.oracle.com/technetwork/java/jaifaq-138288.html), поэтому ваши ссылки не лишены заслуг , –

1

В родных библиотеках Java нет возможности читать Tiff-файл в своих компонентах .... так что вы застряли в использовании либо внешней библиотеки, либо создаете свой собственный.

@Joop предоставил ссылку, чтобы родной библиотеки Java я не был в курсе (! Знать свои инструменты) Если вы не можете найти полную необходимую поддержку там, вы можете найти следующую полезную:

Спецификация файлов Tiff не слишком сложна. Я бы подумал о написании своего собственного файлового ридера.

Java-JAI выглядит она signifciantly расширенную поддержку для чтения и разбора TIFF файлов. Рассмотрим:

+0

Я бы предположил, что OP уже использует JAI или аналогичный, но на всякий случай. Вместо того чтобы писать собственный читатель (что весело, но занимает довольно много времени), вы можете использовать [мой] (https://github.com/haraldk/TwelveMonkeys#aldusadobe-tagged-image-file-format-tiff). :-) – haraldK

1

В дополнении к @ ответу Joop в:

Всех ImageIO ImageReader реализации поддерживают ImageReadParam с исходными областями определена (ImageReadParam.setSourceRegion(rect)), так что вы можете извлечь только определенную область всего изображения. Это будет работать для любого читателя, даже если базовый формат не поддерживает тайлинг, а также независимо от размера плитки для черепичного TIFF (или другого формата, поддерживающего плитки).

Пример:

ImageReader reader = ImageIO.getImageReaders(input).next(); 
reader.setInput(input); 

ImageReadParam param = reader.getDefaultReadParam(); 
param.setSourceRegion(new Rectangle(x, y, w, h)); 

BufferedImage aoi = reader.read(0, param); 

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

Смежные вопросы