使用Java进行基于ICC的图像转换

tmm*_*mls 2 java image-processing color-management color-profile

我想使用 ICC 配置文件和 Java 转换图像。源图像可以是基于 RGB 或 CMYK 的,也可以嵌入 icc 配置文件。新图像还应采用 RGB 或 CMYK 颜色模式,并且必须嵌入 icc 配置文件。所有源图像都将采用 JPEG 格式。

我应该使用哪个(外部/内部)Java 框架/库?什么方法最适合用于基于 RGB > CMYK 或 RGB > RGB 或 CMYK > CMYK 或 CMYK > RGB icc 的图像转换?

有内存限制吗?它可以处理更大的图像文件吗?以及如何处理 sRGB 和 Adob​​eRGB 之间的差异?

有没有人有使用 Java 处理图像转换的经验?

谢谢

har*_*ldK 5

警告:您的问题含糊不清/范围很广,因此答案也必须如此。但我真的认为它值得一个答案。

核心 Java 2D 类对 ICC 配置文件有很好的支持。见ICC_ProfileICC_ColorSpace

您可以使用ColorConvertOp在颜色空间(或颜色配置文件)之间进行转换。它同时支持BufferedImages 和WritableRasters,并且对于 ICC 转换通常很快(在后台使用本机库)。它将处理您提到的所有转换,包括 sRGB 和 Adob​​eRGB 差异。

到现在为止还挺好。

要使用 ICC 配置文件读取和写入 JPEG 文件,事情变得有点复杂。理论上,标准ImageIOAPI就是您所需要的。您需要同时获取元数据 ( IIOMetadata) 和像素(作为RasterBufferedImage)。

ICC 配置文件将是元数据的一部分。您需要获取此处指定的本机 JPEG 元数据。对于 RGB JPEG,这就是您所需要的。

不幸的是,作为JPEGImageReader所有 Oracle JRE 一部分的标准不支持将 CMYK 数据作为BufferedImage. 您必须阅读为Raster. 栅格通常包含 YCbCr 或 YCCK 数据,具体取决于写入时使用的颜色转换,因此您可能还必须处理该转换。或者,您可以将我的JPEG 插件用于 ImageIO,它直接支持 CMYK JPEG。

写作几乎是一样的。编写 RGB 是“直截了当”(尽管它需要几行代码),而编写 CMYK 则更难。重要的是使用从您读取的图像中获得的元数据,然后将 ICC 配置文件替换为您已转换为的配置文件。最后将元数据和更新后的图像数据写回。我正在为我的 .CMYK JPEG 写支持工作JPEGImageWriter,使它像写 RGB 一样简单。我可以给你一个“先睹为快”,但它还没有 100% 准备好生产。

对于 Java 2D 和BufferedImage/Raster相关操作的所有内容,您通常会受到可用(堆)内存(以及 Java 中的最大数组大小,如果您有那么多 RAM)的限制。有一些解决方法,请随时查看我的MappedImageFactory这里MappedFileBuffer了解 nio MappedByteBuffer(内存映射文件缓冲区)支持的数据缓冲区BufferedImage。我确信 JAI 对此也有一些选择,但我通常不建议将 JAI 用于新代码,因为它似乎完全被 Oracle 蒙在鼓里。

好的?祝你好运!不过,准备花一些时间在这上面。:-)