思路:
經過兩天的查資料,各大網站對於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的。這邊的話確實達到了我想要的結果。