我正在使用OpenIMAJ库,它在" JPEG"和" PNG"文件但在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所以我试过了#34; 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 ,我注意到错误来自方法" read&# 34; class" 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 :(得分:0)
TIFF是一种可怕的格式,因为它有许多自定义扩展,并不总是由库支持。 OpenIMAJ尝试通过使用一批不同的库来解决其中一些问题,以便读取各种不同的图像,但是在这种情况下,它会失败。正如您所注意到的,有一个10mb缓冲区限制导致问题 - 将其增加到100mb可以加载您链接的图像。我将更新代码来解决这个问题(因为它只是一个限制,似乎底层缓冲区要小得多,所以这不应该导致任何问题)。
作为快速解决方案,直到部署新快照,您可以加载与此链接的图像:
MBFImage img = ImageUtilities.
createMBFImage(Sanselan.getBufferedImage(new File("tif.tif")), false);
似乎有一个单独的问题,Sanselan似乎无法加载您的所有图像(基于指向未知图像压缩的堆栈跟踪)。如果您可以在GitHub错误报告(https://github.com/openimaj/openimaj/issues/119)上提供指向此类图像的链接,那么可以使用TwelveMonkeys为这些图像编写代码,或者我们可以看到更新版本的Sanselan是否修复了问题。同样,在此期间,您可以直接在代码中使用TwelveMonkeys代替这些图片,并使用上面的MBFImage
转换为ImageUtilities
。