1. 程式人生 > >java 實現 RGB 圖片轉成 CMYK tiff 圖片

java 實現 RGB 圖片轉成 CMYK tiff 圖片

思路:

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