【问题标题】:Decoding of old style JPEG-in-TIFF data is not supported不支持旧式 JPEG-in-TIFF 数据的解码
【发布时间】:2018-04-04 00:35:27
【问题描述】:

我需要显示扫描的 tiff 文件的第 3 页。我使用了代码

TIFFReader reader = new TIFFReader(new File(pathOfFile));    
RenderedImage image = reader.getPage(2);    

它有时会起作用。并显示错误:不支持旧式 JPEG-in-TIFF 数据的解码。 我用的是 aspriseTIFF.jar

那么我如何解决这个问题。 请回复。 提前谢谢

【问题讨论】:

  • 'new File(f1.getAbsolutePath())' 只是写 'f1' 的一种复杂方式。你不需要像这样毫无意义的复杂情况。
  • 你在使用什么TIFFReader 类?您可以尝试使用我的 TIFFImageReader ImageIO 插件,可在此处获得:github.com/haraldk/TwelveMonkeys 它确实支持 TIFF 中“旧式”JPEG 的(某些)版本。如果您附上一些不受支持的图片,我可以为您测试。
  • @EJP 除非f1 是具有getAbsolutePath() 方法的类文件对象,但不是FileFile 子类的实例。
  • @EJP,JAB,我编辑了问题,以便您可以专注于问题...
  • @user3437103 你不应该在合理的情况下回滚编辑。

标签: java tiff


【解决方案1】:

您遇到的问题是您使用的库不支持“旧样式”JPEG compression in the TIFF format (compression == 6)。

我猜这很常见,因为“旧式”JPEG 压缩在 TIFF 中已被弃用,因为它从未完全指定。由于这个规范不足,不同的供应商以不同的、不兼容的方式实现它。放弃了对 TIFF 压缩 7 的支持,JPEG

很遗憾,使用这种压缩的旧 TIFF 文件仍然存在,因此您需要寻找另一个库。好消息是您可以使用 ImageIO 和适当的插件。

使用 TIFF ImageReader 插件,例如我的 TwelveMonkeys ImageIO 开源项目中的插件,您应该能够做到这一点:

// Create input stream
try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
    // Get the reader
    ImageReader reader = ImageIO.getImageReaders(input).next();

    try {
        reader.setInput(input);

        // Read page 2 of the TIFF file
        BufferedImage image = reader.read(2, null);
    }
    finally {
        reader.dispose();
    }
}

(对try/finally 样板感到抱歉,但避免资源/内存泄漏很重要)。

【讨论】:

  • 你怎么知道TIFF文件有多少页?我找不到任何 TwelveMonkeys 库的示例,可以从多页 tif 文件中将单页提取为 JPEG 或 PNG 格式。
  • 请不要使用 cmets 提问。但是...这是标准 ImageIO 功能,适用于任何 ImageReader,只需使用 reader.getNumImages(true)
  • try-with-resource for Java7+ try (ImageInputStream input = ImageIO.createImageInputStream(file)) { ... } 将节省一个 try { } finally { }(但不是 reader.dispose()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多