2014-10-01 59 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格式的最有效方式。 :-)