gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:01:41 25 4
gpt4 key购买 nike

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

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

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

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

谢谢

最佳答案

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

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

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

到目前为止,还不错。

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

ICC 配置文件将成为元数据的一部分。您需要获取 native JPEG 元数据 specified here .对于 RGB JPEG,这就是您所需要的。

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

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

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

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

关于java - 使用 Java 进行基于 ICC 的图像转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29707253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com