【问题标题】:how can I convert an RGB image to CMYK and vice versa in Java?如何在 Java 中将 RGB 图像转换为 CMYK,反之亦然?
【发布时间】:2010-12-17 16:06:14
【问题描述】:

我们的网络应用程序允许用户下载不同格式(bmp、png 和 jpeg)的动态生成的图像。我们的一些用户下载图像进行打印,因此我们希望允许他们在 RGB 或 CMYK 之间进行选择。 创建 RenderedImage/BufferedImage 时有没有办法指定颜色模型?如果不是,默认颜色模型是什么,如何将其更改为另一种? 欢迎使用代码 sn-ps :)

谢谢,

奥利维尔。

【问题讨论】:

标签: java rgb java-2d bufferedimage cmyk


【解决方案1】:

【讨论】:

  • 加载颜色配置文件似乎是一个更好的解决方案,因为我使用了一个代表 CMYK 颜色空间的类,但生成的图像具有“错误”颜色,而当我加载 CMYK 配置文件时,生成的图像具有与原始图像相当的颜色。
【解决方案2】:

某些图像格式不允许 CMYK 颜色空间(PNG、JPEG/JFIF、GIF...),对于普通用户来说,以 RGB 打印是可取的。

您需要向客户提供 CMYK 图像的原因是什么?

【讨论】:

    【解决方案3】:

    要通过Java将RGB图像转换为CMYK图像,最简单的方法之一是使用JAI(Java Advanced Image)。

    下载JAI:http://download.java.net/media/jai/builds/release/1_1_3/

    下载 JAI ImageIO:http://download.java.net/media/jai-imageio/builds/release/1.1/

    代码如下:

    public static void rgbToCmyk() throws IOException{
    
        BufferedImage rgbImage = ImageIO.read(new File("C://Users//Public//Pictures//Sample Pictures//RGB_IMAGE.jpg"));
        BufferedImage cmykImage = null;
        ColorSpace cpace = new ICC_ColorSpace(ICC_Profile.getInstance(RbgToCmyk.class.getClassLoader().getResourceAsStream("ISOcoated.icc")));
        ColorConvertOp op = new ColorConvertOp(rgbImage.getColorModel().getColorSpace(), cpace, null);       
        cmykImage = op.filter(rgbImage, null);
    
        JAI.create("filestore", cmykImage, "c:/tmp/CMYK_IMAGE.TIF", "TIFF");
    }
    

    注意:“ISOcoat.icc”是我的 ICC 配置文件。您可以从打印机或其他地方获取它。

    【讨论】:

      【解决方案4】:

      建议使用fromRGB() - 请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/awt/color/ColorSpace.html

      示例代码:

      java.awt.color.ColorSpace
      
      ColorSpace cmyk = new ColorSpace(ColorSpace.TYPE_CMYK, 4);
      float[] values = cmyk.fromRGB(rgbFloatArray);
      

      public abstract float[] fromRGB(float[] rgbvalue)

      将假定在默认 CS_sRGB 颜色空间中的颜色值转换为此 ColorSpace。

      此方法使用旨在在输入和输出颜色之间产生最佳感知匹配的算法来转换颜色值。为了进行颜色值的比色转换,应该先使用 CS_sRGB 颜色空间的 toCIEXYZ 方法将输入颜色空间转换为 CS_CIEXYZ 颜色空间,然后再使用该颜色空间的 fromCIEXYZ 方法将 CS_CIEXYZ 转换为输出色彩空间。有关详细信息,请参阅 toCIEXYZ 和 fromCIEXYZ。

      【讨论】:

      • 不,你不能那样做。 ColorSpace 是一个抽象类!
      • 哦,太棒了,很好发现。在这种情况下,我建议使用该线程中的一些示例和代码:java.net/forum/topic/javadesktop/java-desktop-technologies/…
      • 马克,在我学习了 JAI API 中的无数类之后,这个线程实际上帮助了我很多。我的代码正在运行,需要一些清理,完成后我会发布它。谢谢。
      • 太棒了,很高兴我发布的东西最终有所帮助;)
      • 您可以使用download.oracle.com/javase/6/docs/api/java/awt/color/…获取CMYK色彩空间的一个实例,然后用它来转换您的图像对象的像素数据。
      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多