使用BufferedImage和JAI从文件中读取TIFF图像

时间:2012-01-02 09:24:45

标签: java tiff javax.imageio jai

我正在尝试使用BufferedImage从文件中读取TIFF图像。以下是我的代码:

String filename = "/image/parrot.tiff";
File f = new File (filename);
try{
        BufferedImage img = ImageIO.read(f);
}catch (Exception e){
        System.out.println("Something went wrong!");
}

但它不起作用。我有一个名为testInput的方法,只是为了测试文件是否被正确读取:

public void testInput(){
    System.out.println(f.exists());
    System.out.println(f.canRead());
    System.out.println(f.canWrite());
}*/

他们三个总是返回“false”,上面的代码总是返回“出错了!”。我已经为插件添加了JAI ImageIO来读取TIFF图像。知道什么似乎是问题吗?

3 个答案:

答案 0 :(得分:5)

你需要确保你准备好了JAI。 JAI是ImageIO的插件扩展,如果不存在,则无法解码TIFF。这是一个快速的单元测试:

@Test
public void canGetTiffDecoder()
{
    Iterator<ImageReader> reader = ImageIO.getImageReadersByFormatName("TIFF");
    assertNotNull(reader);
    assertTrue("No tiff decoder", reader.hasNext());
}

答案 1 :(得分:2)

看起来很傻,但你确定你的文件放在

/image/parrot.tiff

根据Javadoc,exists()返回:

  

当且仅当此抽象路径名表示的文件或目录存在时才为true;否则是假的

所以我认为这条路可能是错的。根据你的评论,我认为正确的道路应该是

src/image/parrot.tiff

如果不是,请尝试

src/image/parrot.tiff

在所有情况下,您必须更好地了解如何使用Java(以及大多数其他语言)管理文件路径; - )

答案 2 :(得分:1)

使用什么格式的tif也很重要。即使使用JAI插件,也只支持某些形式的tiff。例如,当我下载bluemarble.tif图像时,深入了解我的内部工作:

引起:java.lang.RuntimeException:不支持平面(带序)格式TIFF。

因此,如果没有专业库的帮助,则不支持某些tif文件格式。其中一个库是GDAL。 http://gdal.org/java/然而,许多支持库将需要本机代码,并且可能无法在可移植的纯Java上下文中工作。