2017-03-06 46 views
0

我正在使用OpenIMAJ库,它在“JPEG”和“PNG”文件上运行良好,但在tiff文件上它给我一个错误。下面是代码:OpenIMAJ库无法读取tiff文件?

import org.openimaj.image.ImageUtilities; 
import org.openimaj.image.MBFImage; 

.... 

File file = new File("/home/mosab/Desktop/input/tif.tif"); 
MBFImage input = ImageUtilities.readMBF(file); 

,这里是错误:

Exception in thread "main" java.io.IOException: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:189) 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126) 
    at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355) 
    at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49) 
Caused by: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7 
    at org.apache.sanselan.formats.tiff.datareaders.DataReader.decompress(DataReader.java:135) 
    at org.apache.sanselan.formats.tiff.datareaders.DataReaderStrips.readImageData(DataReaderStrips.java:96) 
    at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:505) 
    at org.apache.sanselan.formats.tiff.TiffDirectory.getTiffImage(TiffDirectory.java:163) 
    at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:441) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1264) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1163) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1136) 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:187) 
    ... 3 more 

这是TIFF文件(支持GeoTiff具体)我使用:

https://drive.google.com/file/d/0ByKaCojxzNa9MWxPTUJjZURHR1E/view?usp=sharing

这是否意味着OpenIMAJ库不支持tiff格式/ GeoTiff?

我认为OpenIMAJ不支持tiff,因此我尝试使用“TwelveMonkeys”库来读取该文件。 “TwelveMonkeys”库单独/单独可以读取文件。因此,我导入了TwelveMonkeys库与OpenIMAJ一起工作,因此支持tiff文件,这对于一些tiff文件,但对于该文件是行不通的(尽管“TwelveMonkeys”能够单独在单独项目中读取它),而我得到这个异常:

Exception in thread "main" java.io.IOException: Resetting to invalid mark 
at java.io.BufferedInputStream.reset(BufferedInputStream.java:448) 
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:185) 
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126) 
at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355) 
at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49) 

后来我跟踪我发现,因为它是围绕26MB东西可能与文件大小的错误消息,我注意到,该错误方法来源于“读”我认为它使用最大尺寸的类“org.openimaj.image.ExtendedImageIO”的类别10mb

public static BufferedImage read(InputStream input) throws IOException { 
    if (input == null) { 
     throw new IllegalArgumentException("input == null!"); 
    } 

    final NonClosableInputStream buffer = new NonClosableInputStream(input); 
    buffer.mark(10 * 1024 * 1024); // 10mb I think here is the problem 

    BufferedImage bi; 
    try { 
     bi = readInternal(buffer); 
    } catch (final Exception ex) { 
     bi = null; 
    } 

    if (bi == null) { 
     buffer.reset(); 
     try { 
      bi = Sanselan.getBufferedImage(buffer); 
     } catch (final Throwable e) { 
      throw new IOException(e); 
     } 
    } 

    return bi; 
} 

那么我该如何解决这个问题,并在OpenIMAJ中读取该tiff文件(为了进一步应用设施,OpenIMAJ提供了如聚类/分段)?

+0

可以压缩TIFF文件中的图像数据; TIFF格式支持不同的压缩方法。显然(根据错误消息),您正在使用的库不支持您要读取的TIFF文件中使用的特定压缩方法。 – Jesper

+1

@Jesper感谢您的回复。但正如你所看到的“TwelveMonkeys”库能够读取所有tiff文件,并且当我将“TwelveMonkeys”库导入到我的项目中(仅导入没有其他编码),现在我可以读取tiff文件并在它们上应用OpenIMAJ函数;但是对于那个文件,因为我认为它比OpenIMAJ允许的大,这就是为什么它无法处理它。我认为OpenIMAJ团队应该取消限制,即缓冲区的大小为10mb。 –

+0

TIFF压缩7是[(“新风格”)JPEG](http://www.awaresystems.be/imaging/tiff/tifftags/compression.html)。 TwelveMonkeys ImageIO可以读取这些内容,我认为JAI ImageIO也可以。 – haraldK

回答

0

TIFF是一种可怕的格式,因为它有许多自定义扩展,这些扩展并不总是受库支持。 OpenIMAJ尝试通过使用一批不同的库来解决其中一些问题,以便读取各种不同的图像,但在这种情况下,它失败了。正如你已经注意到有一个10MB的缓冲区限制导致了一个问题 - 增加到100MB允许您链接的图像被加载。我会更新代码来解决这个问题(因为它只是一个限制,看起来底层缓冲区要小得多,所以这不应该引起任何问题)。

作为一个快速的变通,直到新的快照部署,可以装载你这个链接的图像:

MBFImage img = ImageUtilities. 
    createMBFImage(Sanselan.getBufferedImage(new File("tif.tif")), false); 

有似乎是一个单独的问题是Sanselan似乎并没有被能够加载所有的图像(根据堆栈跟踪引用未知的图像压缩)。如果您可以在GitHub bug报告(https://github.com/openimaj/openimaj/issues/119)上提供这样一个图像的链接,那么有可能在为这些图像使用TwelveMonkeys的后备代码中进行编码,或者我们可以看到新版本的Sanselan是否修复了这个问题。再次,在此期间,您可以直接使用TwelveMonkeys代码中的图像,并使用ImageUtilities将其转换为MBFImage

+0

解决方法“ImageUtilities.createMBFImage”工作! –