2014-10-01 58 views
4

比方說,我有一個非常大的TIFF圖像作爲輸入。由於我必須遵守內存規格,我無法完全加載此圖像。所以下面是不是一個選項:如何通過Java使用磁貼讀取TIFF文件?

BufferedImage data = ImageIO.read(image); 

有沒有任何Java庫允許讀取圖像的特定部分,而不緩衝整個圖像?或者從流中獲取TIFF圖塊的一些方法?

回答

6

的ImageIO可以爲您提供一個ImageReader爲TIFF,然後你可以使用readTile。 ImageIO有幾種getImageReadersBy...方法。

我不知道ImageIO是否支持tiff,但ImageIO使用java SPI,因此可以插入ImageReaders和ImageWriters。

實際上,這是針對read的快捷方式,配置爲瓷磚的ImageReadParam

從來沒有使用瓷磚,但看到了先前的答案,我想指出這個選項。

+0

我已經使用了瓷磚,但使用了不同的語言,並且從來沒有意識到API直接適應了它,並且我認爲我知道API ...嗯,感謝您的教訓。 – rolfl 2014-10-01 10:49:19

+0

@rolfl嘿,我不知道是否支持tiff,也許通過[JAI](http://www.oracle.com/technetwork/java/jaifaq-138288.html),所以你的鏈接不是沒有價值的。 – 2014-10-01 11:08:00

1

原生Java庫中沒有辦法能夠讀取它的組件中的Tiff文件....所以,你堅持使用外部庫或建立自己的。

@Joop提供了一個鏈接到本地​​Java庫我是不知道的(!知道你的工具),如果你不能找到你需要有完整的支持,你可能會發現以下有用:

Tiff文件的規範並不複雜。我會考慮爲它編寫我自己的文件閱讀器。

Java的JAI看起來像它具有讀取和解析TIFF文件signifciantly擴展支持。試想一下:

+0

我猜測OP已經使用JAI或類似的,但以防萬一..而不是寫你自己的閱讀器(這是很好玩,但需要相當一段時間),你可以使用[我]( https://github.com/haraldk/TwelveMonkeys#aldusadobe-tagged-image-file-format-tiff)。 :-) – haraldK 2014-10-02 12:49:24

1

爲補充@喬普的回答是:

所有的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格式的最有效方式。 :-)