OpenJDK 8中ImageIO.read存在bug,有什么解决方法?

9

我正在使用Java 8 (具体来说是OpenJDK 8)进行一个项目,需要从JPG文件中读取图像。一开始搜索到一些类似的问题(例如将字节数组读入缓冲区图像而不使用ImageIO是否有一种完全由Java编写的替代ImageIO读取JPEG文件的方法?),但我的问题与此不同,并且那里提供的解决方案不符合我的要求。

事实证明,JPEGImageReader类仍然缺失。(参见openjdk-8: Missing JPEGImageReader functions in libjavajpeg.so)。虽然这个错误报告是针对Debian的,但我使用的是Kubuntu 14.10,也受到影响。

根据该报告的最后一条消息,目前似乎没有人在处理此问题...

可以用以下代码片段重现此错误:

// ...
BufferedImage img = null;
try {
    img = ImageIO.read(new File(filename));
} catch (IOException e) {
    throw new RuntimeException(e);
}
// ...

文件路径有效,如果我使用Java 1.7,这个功能可以正常工作,但是更改为1.8会导致在ImageIO.read调用时出现以下异常:

Caught UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageReader.initReaderIDs(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)

我希望在避免以下问题的情况下解决这个问题:
  1. 不需要依赖其他/外部库;
  2. 不需要回到Java 1.7;
  3. 不需要重新构建源代码;
  4. 不需要使用Oracle JDK的专有实现
欢迎提供有效的代码片段。 编辑-1: 添加第4点到列表中。 编辑-2: 修改了主要部分的措辞并添加了另一个参考。

使用Oracle JDK是可能的吗?如果是,您可以在此处找到有关可用的ppa的一些信息:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html - clstrfsck
如果可能的话,我会尽量避免使用Oracle的专有实现。我会更新问题以提及这一点。 - code_dredd
那么 ImageIO.getImageReadersByFormatName("jpeg") 不会返回一个 JPEG 读取器吗? - Joop Eggen
它尝试着去做,但是由于上述错误报告中缺少JPEGImageReader类,它无法完成。这会导致原始帖子中提到的UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageReader ...异常。 - code_dredd
@msandiford:目前似乎没有办法解决OpenJDK 8中的这个问题,所以我不情愿地安装了Oracle的JDK 8实现,并且它可以工作。一旦他们修复了这个严重的错误,我将立即回到OpenJDK 8。但是,我不确定我是否可以将评论标记为被接受的答案。 - code_dredd
嗨@ray。我已经将评论转换为答案(某种程度上)。 - clstrfsck
4个回答

3
我相信此问题已在2015年3月17日发布的版本(openjdk-8 Source-Version: 8u40-b27-1)中得到修复,如Matthias Klose的电子邮件所述:
“我们认为您报告的错误已在最新版本的openjdk-8中得到了修复,这个版本将被安装在Debian FTP存档中。该版本和之前版本之间的变化摘要附上。感谢您报告了这个错误,它现在将被关闭。如果您有更多评论,请将其发送至760926@bugs.debian.org,维护者将在适当时重新打开错误报告。Debian分发维护软件pp. Matthias Klose(更新的openjdk-8包的供应商)。 (此消息是根据他们的要求自动生成的;如果您认为存在问题,请通过发送电子邮件至ftpmaster@ftp-master.debian.org与存档管理员联系)。”

我昨天看到了这封电子邮件,但是我还没有看到软件包更新在存储库中发布或者有时间去尝试它。我会在自己尝试后进行更新。 - code_dredd
我确认了包已经更新并且今天可用,使用的是来自Kubuntu 15.04的java-8-openjdk-amd64。 - code_dredd

3

可以使用Oracle JDK吗?

如果可以的话,在Ubuntu上可以使用此ppa获取相关信息。


1
你可以安装Java高级图像,这也提供了JPEG(和其他编解码器)实现。

谢谢您的建议,但这与第一点相违背,该点明确试图避免对外部库的额外依赖。安装JAI正是这样做的。 - code_dredd
可以请您详细说明如何做吗?我不介意增加额外的依赖。 - KareemJ
@KareemJeiroudi,安装链接提供说明。 - Brett Okken

1
我认为问题出在生成的图片是JPEG格式。当我将其生成为PNG格式时,问题得到了解决。我使用Grabzit API进行截图并以PNG格式保存。

不是格式的问题。有一个错误,即读取jpeg的内部类在包中丢失。 - code_dredd
明白了Ray。所以你能告诉我缺少哪个类吗?如果你知道JAR文件的话,也能一并提一下吗?谢谢。 - Nik
OP的详细信息中包含了你问题的答案。 - code_dredd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接