有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

图像处理Java 8 ImageIO在Linux中无法正确读取JPEG

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

原始图像是:

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

在Windows下的开发工作站上生成的缩略图是绝对正确的

Linux下的结果是颜色偏移(Java8U05上为红色,Java8U11上为颜色偏移)。此处未显示,因为原始示例已在现场,现在已修复

更深入的调查表明,问题在于阅读图像。Windows和Linux上的read(inputStream)返回具有完全相同参数的图像对象,但是相同图像(just read)的color probe 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) 个答案

  1. # 1 楼答案

    你可以尝试使用my JPEGImageReader pluginfor ImageIO,它处理颜色转换的方式与默认的JPEG ImageReader稍有不同,因此它可能会有帮助(抱歉,我的工作电脑不在附近,所以我现在无法测试自己)。如果没用的话,我想把它修好。我可以用你的图片做一个测试用例吗?:-)

    另一个可能有用的方法是指定:

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

    在命令行上(或使用其他方法相应地设置sun.java2d.cmm系统属性)。颜色管理模块(CMM)已从Sun/Kodak的旧版CMM切换到Java 8中更为更新、开源的小CMS。设置此系统属性将从Java pre 8重新启用传统颜色管理

    正如您提到的,没有磁盘访问,它几乎排除了JMagick或im4j,因为它们最适合处理文件。不过,或许可以使用临时文件