如何在Java中将RGB图像转换为CMYK,反之亦然?

时间:2010-12-17 16:06:15

标签: java rgb java-2d bufferedimage cmyk

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

谢谢,

奥利弗。

4 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

某些图像格式不允许使用CMYK色彩空间(PNG,JPEG / JFIF,GIF ...),而普通用户则需要以RGB格式打印。

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

答案 2 :(得分:-1)

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

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

DownLoad 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");
}

注意:" ISOcoated.icc"是我的ICC个人资料。您可以从打印机或其他地方获取它。

答案 3 :(得分:-2)

建议使用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转换为输出颜色空间。有关详细信息,请参阅CIEXYZ和fromCIEXYZ。