我们的网络应用程序允许用户下载不同格式(bmp、png 和 jpeg)的动态生成的图像。我们的一些用户下载图像进行打印,因此我们希望允许他们在 RGB 或 CMYK 之间进行选择。创建 RenderedImage/BufferedImage 时有没有办法指定颜色模型?如果不是,默认颜色模型是什么,如何将其更改为另一种?欢迎使用代码片段:)
谢谢,
奥利维尔。
我们的网络应用程序允许用户下载不同格式(bmp、png 和 jpeg)的动态生成的图像。我们的一些用户下载图像进行打印,因此我们希望允许他们在 RGB 或 CMYK 之间进行选择。创建 RenderedImage/BufferedImage 时有没有办法指定颜色模型?如果不是,默认颜色模型是什么,如何将其更改为另一种?欢迎使用代码片段:)
谢谢,
奥利维尔。
某些图像格式不允许 CMYK 颜色空间(PNG、JPEG/JFIF、GIF...),对于普通用户来说,以 RGB 打印是可取的。
您需要向客户提供 CMYK 图像的原因是什么?
要通过 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 配置文件。您可以从打印机或其他地方获取它。
建议使用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);
公共抽象 float[] fromRGB(float[] rgbvalue)
将假定在默认 CS_sRGB 颜色空间中的颜色值转换为此颜色空间。
此方法使用旨在在输入和输出颜色之间产生最佳感知匹配的算法来转换颜色值。为了进行颜色值的比色转换,应该先使用 CS_sRGB 颜色空间的 toCIEXYZ 方法将输入颜色空间转换为 CS_CIEXYZ 颜色空间,然后再使用该颜色空间的 fromCIEXYZ 方法将 CS_CIEXYZ 转换为输出色彩空间。有关详细信息,请参阅 toCIEXYZ 和 fromCIEXYZ。