思路:
经过两天的查资料,各大网站对于RGB --转成----CMYK的资料几乎没有,查的最多的或许是CMYK -- 转成---RGB 。那么基于这写资料,他们之间的转化,可能是公式不一样,但是思路其实都是想通的。
对于CMYK to RGB ,我的想法是,拿到RGB图片,然后从坐标原点遍历循环图片每一个像素,拿到像素的每一个RGB区域色值,然后将图片RGB 的色组空间修改为CMYK的色组空间。对于图片同一个像素将RGB的色值改为CMYK的色值。然后生成一个tiff文件(查询资料,生成cmyk的.jpg可能有问题--没有深去研究)。
public void getImagePixel(String image) throws Exception {
int[] rgb = new int[3];
File file = new File(image);
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
} catch (Exception e) {
e.printStackTrace();
}
//很重要的方法---将图片的RGB色域空间转化为CMYK色域空间
BufferedImage cmykImg = changeColorSpace(bi);
int width = bi.getWidth();
int height = bi.getHeight();
int minx = bi.getMinX();
int miny = bi.getMinY();
System.out.println("width=" + width + ",height=" + height + ".");
System.out.println("minx=" + minx + ",miniy=" + miny + ".");
for (int i = minx; i < width; i++) {
for (int j = miny; j < height; j++) {
int pixel = bi.getRGB(i, j); // 下面三行代码将一个数字转换为RGB数字
rgb[0] = (pixel & 0xff0000) >> 16;
rgb[1] = (pixel & 0xff00) >> 8;
rgb[2] = (pixel & 0xff);
System.out.println("i=" + i + ",j=" + j + ":(" + rgb[0] + ","
+ rgb[1] + "," + rgb[2] + ")");
float[] abc = {rgb[0],rgb[1],rgb[2]};//获取RGB色域空间数组
bi.setRGB(123, 123, 123);
//将此像素RGB色值转化为cmyk色值
float[] cmykRes = cmykImg.getColorModel().getColorSpace().fromRGB(abc);
//把cmyk色值添加到色域空间
cmykImg.getColorModel().getColorSpace().toRGB(cmykRes);
System.out.println("結果:"+cmykRes[0]+","+cmykRes[1]+","+cmykRes[2]+","+cmykRes[3]);
}
}
//生成这个cmyk tiff 文件
JAI.create("filestore", cmykImg, "D://CMYK_IMAGE.TIF", "TIFF");
}
private BufferedImage changeColorSpace(BufferedImage targetImage) throws IOException {
//Iss空间管理配置文件 这个文件我是放在项目resouce里面的 后面会贴上
final ICC_Profile ip = ICC_Profile.getInstance("profiles/ISOcoated_v2_300_eci.icc");
//转化色值空间
final ColorConvertOp cco = new ColorConvertOp(targetImage.getColorModel().getColorSpace(), new ICC_ColorSpace(ip), null);
BufferedImage cmykImage = cco.filter(targetImage, null);
ColorModel c = cmykImage.getColorModel();
int ty = cmykImage.getColorModel().getColorSpace().getType();//为了查看这个图片是不是CMYK的
return cmykImage;
}
public static void main(String[] args) throws Exception {
ImageData rc = new ImageData();
System.out.println(x + " - ");
rc.getImagePixel("D:\\file.jpg");
}
这个上面 转换色域空间的话用的是 ColorCOnvertOp ---大家可以去研究一下这个方法。然后生成tiff文件,需要使用的是JAI,需要导入两个jar包
结果:
RBG 图片 :
CMYK :
可以看出,两张图片颜色有变化。说明达到效果了。其实也可以在程序中输出提示信息。看看结果是否转化成了cmyk的。这边的话确实达到了我想要的结果。