Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
来源:互联网 发布:手机点烟软件 编辑:程序博客网 时间:2024/05/22 05:23
Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
ICC_ColorSpace 支持相应的色彩空间标准,有日本、欧洲和美国标准,在其中还有 Web 和 Page 等多种出版物所使用的色彩空间标准,这里以一部分印刷行业中使用的 Japan Coated 为例实现 RGB 和 CMYK 互换,至于其他工业标准的 ICC Profile 则在 C:/Windows/System32/spool/drivers/color/ 目录内,各位可根据自己的需要选择相应的 ICC。
package color;import java.awt.Color;import java.awt.color.ColorSpace;import java.awt.color.ICC_ColorSpace;import java.awt.color.ICC_Profile;import java.io.IOException;import java.math.BigDecimal;import java.util.Arrays;public class ColorConvert{ final static String strPathCMYKProfile = "C:/Windows/System32/spool/drivers/color/JapanColor2001Coated.icc"; public static float[] rgb2cmyk(float... rgb) throws IOException { if (rgb.length != 3) { throw new IllegalArgumentException(); } ColorSpace instance = new ICC_ColorSpace(ICC_Profile.getInstance(strPathCMYKProfile)); float[] cmyk = instance.fromRGB(rgb); return cmyk; } public static float[] cmyk2rgb(float... cmyk) throws IOException { if (cmyk.length != 4) { throw new IllegalArgumentException(); } ColorSpace instance = new ICC_ColorSpace(ICC_Profile.getInstance(strPathCMYKProfile)); float[] fromRGB = instance.toRGB(cmyk); return fromRGB; } public static void main(String[] args) { try { // 以 color 对象输入 Color color = new Color(45, 45, 45); // float rgb1[] = { (float) 45 / 255, (float) 45 / 255, (float) 45 / 255 }; float[] cmyk = rgb2cmyk(color.getRGBColorComponents(null)); // [0.79394215, 0.7535668, 0.73749906, 0.50597394] // float[] cmyk = rgb2cmyk(rgb1); // 就结果而言,Color 对象输入得到的更精确一些。 System.out.println(Arrays.toString(cmyk)); System.out.println(Arrays.toString(cmyk2rgb(cmyk[0], cmyk[1], cmyk[2], cmyk[3]))); // 以 array float 输入 float rgb[] = { 45f / 255f, 45 / 255, 45 / 255 }; float[] cmyk2 = rgb2cmyk(rgb); System.out.println(Arrays.toString(cmyk2)); System.out.println(Arrays.toString(cmyk2rgb(cmyk2[0], cmyk2[1], cmyk2[2], cmyk2[3]))); // 四舍五入取整取 cmyk // BigDecimal dec = new BigDecimal(cmyk[0] * 100).setScale(0, BigDecimal.ROUND_HALF_UP); // cmyk[0] = (int) dec.floatValue(); // // dec = new BigDecimal(cmyk[1] * 100).setScale(0, BigDecimal.ROUND_HALF_UP); // cmyk[1] = (int) dec.floatValue(); // // dec = new BigDecimal(cmyk[2] * 100).setScale(0, BigDecimal.ROUND_HALF_UP); // cmyk[2] = (int) dec.floatValue(); // // dec = new BigDecimal(cmyk[3] * 100).setScale(0, BigDecimal.ROUND_HALF_UP); // cmyk[3] = (int) dec.floatValue(); } catch (IOException e) { e.printStackTrace(); } }}
色彩输入可以使用 Color 对象,也可以使用 float[],Color 对象也是需要转换得到 float[] 才真正进入函数进行操作,而比如 Photoshop 内的 RGB 值是 3 个 0~255 的整数,将3个RGB值分别除以 255 就得到了 float[] 内所需的参数,得到的换算结果则是一个小于等于1的浮点数,要得到类似 Photoshop 内 CMYK 的两位数,乘以 100 即可。
因传参的精确度不一样,得到的结果也将有误差,而用 Color 对象,会更接近 Photoshop 的值,当然 Photoshop 也应当选择对应的色彩空间后再进行比较。
0 0
- Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
- 使用OpenCV实现RGB、HSI、CMYK颜色空间的转换
- Adobe 色彩系统 RGB 和 CMYK 相互转换原理
- 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换
- 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换
- PHP将CMYK颜色值和RGB颜色相互转换的例子
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- RGB和HSL色彩的相互转换
- RGB和HSL色彩的相互转换
- RGB颜色空间和HSV颜色空间以及RGB与Hsv间的相互转换
- CMYK与RGB相互转换(java)
- RGB 和 CMYK 相互转换原理
- VC编程实现色彩空间RGB与XYZ相互转换
- VC编程实现色彩空间RGB与XYZ相互转换
- VC编程实现色彩空间RGB与XYZ相互转换
- 如何使用canvas画连续的线段
- JavaScript基础——强大的数组
- E - Pyramid of Glasses
- Java输入输出流 结构详解
- 欢迎使用CSDN-markdown编辑器
- Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
- eclipse自动补全
- Linux的僵尸进程产生原因及解决方法
- Vue.js学习 Item6 -- Class 与 样式绑定
- select下拉列表的级联
- 263. Ugly Number
- Guava collections -- Sets
- java----IO流
- facebook工具xhprof的安装与使用-分析php执行性能