Java 8 ImageIO在Linux中错误地读取JPEG

时间:2014-08-07 16:46:46

标签: java image-processing java-8 javax.imageio

我正在尝试阅读用户上传的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如上所示。

这与alpha通道无关 - 这个特殊的源图像是JPEG Type 5(TYPE_3BYTE_BGR),从Adobe Lightroom导出并转换为sRGB,没有任何其他技巧。

这也会影响当时导出的所有图像(事实上,此网站上的所有图像)。

任何人都可以就如何使其工作提供一些建议(除了等待JDK的修复)?也许推荐备用库,可以在这里使用(EJB,存储在MongoDB中的数据,因此使用InputStreams获取数据 - 无文件系统访问)。

谢谢!

UPD: 问题似乎与Java8的新色彩管理模块有关 - 它不了解这种图像格式。切换到旧版CMM解决了这个问题。请在下面的正确评论中查看详细信息。

1 个答案:

答案 0 :(得分:4)

您可以尝试将我的JPEGImageReader plugin用于ImageIO,它处理颜色转换的方式与默认的JPEGImageReader略有不同,因此可能帮助(抱歉,不要让我的工作电脑附近,所以我现在无法测试自己)。如果它没有帮助,我想解决它。我可以将您的图像用于测试用例吗? : - )

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

-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider
命令行上的

(或使用其他方法相应地设置sun.java2d.cmm系统属性)。色彩管理模块(CMM)从Sun / Kodak的传统CMM切换到Java 8中更新,最开源的Little CMS。设置此系统属性将重新启用传统色彩管理Java pre 8.

当你提到没有磁盘访问时,它几乎排除了JMagick或im4j,因为它们最适合文件。可能会使用临时文件。