OpenIMAJ库无法读取tiff文件?
我正在使用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提供了如聚类/分段)?
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
。
解决方法“ImageUtilities.createMBFImage”工作! –
可以压缩TIFF文件中的图像数据; TIFF格式支持不同的压缩方法。显然(根据错误消息),您正在使用的库不支持您要读取的TIFF文件中使用的特定压缩方法。 – Jesper
@Jesper感谢您的回复。但正如你所看到的“TwelveMonkeys”库能够读取所有tiff文件,并且当我将“TwelveMonkeys”库导入到我的项目中(仅导入没有其他编码),现在我可以读取tiff文件并在它们上应用OpenIMAJ函数;但是对于那个文件,因为我认为它比OpenIMAJ允许的大,这就是为什么它无法处理它。我认为OpenIMAJ团队应该取消限制,即缓冲区的大小为10mb。 –
TIFF压缩7是[(“新风格”)JPEG](http://www.awaresystems.be/imaging/tiff/tifftags/compression.html)。 TwelveMonkeys ImageIO可以读取这些内容,我认为JAI ImageIO也可以。 – haraldK