【发布时间】:2019-07-04 14:42:54
【问题描述】:
我有多个图像,其中嵌入了自定义配置文件,并希望将图像转换为 sRGB 以便将其提供给浏览器。我见过如下代码:
BufferedImage image = ImageIO.read(fileIn);
ColorSpace ics = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorConvertOp cco = new ColorConvertOp(ics, null);
BufferedImage result = cco.filter(image, null);
ImageIO.write(result, "PNG", fileOut);
其中fileIn 和fileOut 是分别代表输入文件和输出文件的文件对象。这在一定程度上有效。问题是生成的图像比原始图像更亮。如果我要在 Photoshop 中转换颜色空间,颜色会显示相同。事实上,如果我用 Photoshop 调出两张图片并截屏并采样颜色,它们是相同的。 Photoshop 做了什么而上面的代码不是,我能做些什么来纠正这个问题?
正在转换的图像有多种类型,包括 JPEG、PNG 和 TIFF。我尝试使用TwelveMonkeys 读取JPEG 和TIFF 图像,但我仍然得到相同的效果,但图像太亮了。当应用于最初没有嵌入配置文件的图像时,转换过程似乎最糟糕。
编辑:
我添加了一些示例图片来帮助解释问题。
- 此图像是其中嵌入了颜色配置文件的图像。在某些浏览器上查看,这一个和下一个之间不会有明显的区别,但在 Mac OSX 和 Windows 上的 Chrome 中查看,它目前看起来比它应该的要暗。这就是我的问题首先出现的地方。我需要将图像转换为可以在 Chrome 中正确显示的内容。
- 这是使用 ImageMagick 转换为 Adobe RGB 1998 颜色配置文件的图像,Chrome 似乎能够正确显示。
- 这是我使用上面的代码转换的图像,它看起来比它应该的要亮。
(请注意,上面的图片是在 imgur 上,所以为了使它们更大,只需删除文件名末尾的“t”,在文件扩展名之前。)
【问题讨论】:
-
这是你必须在 Java 中做的事情吗?可以考虑在命令行中使用 image magick 吗?
-
不可行。当我说多个时,我的意思是超过 20,000 张图像。这些图像用于印刷和数字产品。问题是打印支持颜色配置文件,但浏览器不可靠。 Chrome 在某种程度上似乎是我们的目标浏览器。自定义配置文件似乎无法正确加载。我知道有 jmagick,但如果可能的话,我不想使用命令行包装器。
-
您能否提供带有自定义颜色配置文件的示例图像?
-
@MichaelHogenson 如果 Image Magick 一次只能处理一个图像,我想您可以编写一个相当简单的 bash/PowerShell 脚本来遍历目录中的图像。特别是如果这只是需要发生一次然后就会完成的事情。现在,如果您需要在应用程序代码中,那将是在代码中进行此操作的正当理由。
-
是的,它会在应用程序代码中即时发生,具体取决于图像是用于数字产品还是打印。
标签: java image bufferedimage color-space color-profile