【问题标题】:Java 8 ImageIO reads JPEG incorrectly in LinuxJava 8 ImageIO 在 Linux 中错误地读取 JPEG
【发布时间】:2014-08-07 16:46:46
【问题描述】:

我正在尝试读取用户上传的 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) 返回不同的值。

Java 8u05 和 8u11 在 Linux 中处理的颜色不同,8u05 为“偏红”,8u11 如上所示。

这与 Alpha 通道无关 - 此特定源图像是 JPEG 类型 5 (TYPE_3BYTE_BGR),从 Adob​​e Lightroom 导出并转换为 sRGB,没有任何其他技巧。

这也会影响当时导出的所有图片(实际上是本网站上的所有图片)。

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

谢谢!

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

【问题讨论】:

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


【解决方案1】:

您可以尝试将我的 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,因为它们最适合文件。不过可能可以使用临时文件。

【讨论】:

  • 谢谢!我也会在这里做一些实验。当然,您可以随意使用该图像进行测试 :-)
  • 切换到 Sun/Kodak CMM 解决了这种情况 - 现在一切正常。再次感谢! :-)
  • 那么一切都好! :-) 您可能还应该为 Java 8 提交特定于平台的错误报告,以修复此问题。
  • 是的,我已经在那里提交了错误并等待他们确认回答))
  • @AlexanderTerekhov Oracle 的错误过程非常糟糕。他们不会“确认回答”。他们不会说什么,即使它是固定的。找出报告发生了什么的唯一方法是知道错误报告实际上出现在它们提交到的不同站点上,并在那里手动搜索。我找到了您的错误报告,但显然他们已经将其关闭为“无法重现”。您可能需要再次提交特定的测试图片:bugs.openjdk.java.net/browse/JDK-8054568
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2023-04-06
  • 1970-01-01
  • 2020-11-15
  • 2016-05-16
相关资源
最近更新 更多