100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换

Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换

时间:2021-09-07 03:34:46

相关推荐

Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换

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, 45f / 255f, 45f / 255f };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 也应当选择对应的色彩空间后再进行比较。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。