Java 8中的ImageIO在Linux系统下错误读取JPEG图片

6
我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我正在尝试读取用户上传的JPEG图像(任意)以在服务器应用程序中创建缩略图。 在Windows7 / Oracle Java 8u11上系统运行良好,但在服务器上的CentOS下存在颜色模型问题:

原始图像为:

http://studio-st.ru/media/portfolio/image/45

在Windows开发工作站上生成的缩略图是完全正确的,但在Linux上出现了颜色偏移(Java 8u05呈红色,Java 8u11颜色失真)。由于原始示例已经修复,因此此处未提供。
进一步调查表明,问题出在读取图像上——在Windows和Linux上,ImageIO.read(inputStream)返回具有完全相同参数的图像对象,但是对于相同的图像(刚刚读取),颜色探针getRGB(x,y)返回不同的值。
Linux中的颜色处理在Java 8u05和8u11上有所不同,8u05呈“红色”,而8u11则如上所示。
这与α通道无关——此特定源图像为JPEG Type 5(TYPE_3BYTE_BGR),从Adobe Lightroom导出,并转换为sRGB,没有任何其他技巧。
这也影响到当时导出的所有图像(实际上是该网站上的所有图像)。
除了等待JDK的修复之外,是否有人可以提供关于如何使其正常工作的建议?或者建议替代库,可在此处使用(EJB,数据存储在MongoDB中,因此使用InputStream获取数据-没有文件系统访问)。
谢谢!

更新:问题似乎与Java8的新颜色管理模块有关 - 它不理解这种图像格式。切换到传统的CMM可以解决这个问题。请参阅下面正确评论中的详细信息。


谢谢,我得做一些实验 JAI... - Alexander Terekhov
1个回答

4
您可以尝试使用我的JPEGImageReader插件来处理ImageIO,它处理颜色转换的方式与默认的JPEGImageReader略有不同,因此可能会有所帮助(抱歉,我现在没有我的工作电脑,无法自行测试)。如果它没有帮助,我想修复它。我能用您的图像作为测试用例吗? :-)

另一件可能有帮助的事情是指定:

-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider

在命令行上执行(或使用其他方式相应地设置sun.java2d.cmm系统属性)。在Java 8中,颜色管理模块(CMM)从Sun/Kodak的传统CMM切换到更为现代化和开源的Little CMS。设置此系统属性将重新启用Java 8之前的旧版颜色管理。
由于您没有提及磁盘访问,因此JMagick或im4j基本上不适用,因为它们最适合处理文件。但可能可以使用临时文件。

1
谢谢!我也会在这里进行一些实验。当然,随意使用图像进行测试 :-) - Alexander Terekhov
切换到Sun/Kodak CMM解决了问题 - 现在一切都按预期工作。再次感谢! :-) - Alexander Terekhov
一切都好了! :-) 你可能应该为Java 8提交一个特定于平台的错误报告,以便解决这个问题。 - Harald K
1
是的,我已经在那里提交了错误报告,并正在等待他们确认并回复)) - Alexander Terekhov
1
@AlexanderTerekhov Oracle的错误处理流程相当糟糕。他们不会“确认回答”。即使问题已经解决,他们也不会说任何话。了解报告的进展情况唯一的方法是知道错误报告实际上出现在不同的网站上,并手动搜索。我找到了你的错误报告,但显然他们已经将其标记为“无法重现”并关闭了它。您可能需要再次提交并附上特定的测试图片:https://bugs.openjdk.java.net/browse/JDK-8054568 - Boann
能否重新打开它?无论如何,我认为将这个SO问题链接到错误报告中会是一个好主意,以显示这是一个真正的问题,需要什么来修复它。 - Harald K

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