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的。这边的话确实达到了我想要的结果。

猜你喜欢

转载自blog.csdn.net/qq_29648387/article/details/84581273