java 實現 RGB 圖片轉成 CMYK tiff 圖片
阿新 • • 發佈:2018-11-28
思路:
經過兩天的查資料,各大網站對於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的。這邊的話確實達到了我想要的結果。