我正在尝试实现一个解决方案,用于计算RGB和CMYK之间的转换,反之亦然。这是我到目前为止所知道的:
public static int[] rgbToCmyk(int red, int green, int blue)
{
int black = Math.min(Math.min(255 - red, 255 - green), 255 - blue);
if (black!=255) {
int cyan = (255-red-black)/(255-black);
int magenta = (255-green-black)/(255-black);
int yellow = (255-blue-black)/(255-black);
return new int[] {cyan,magenta,yellow,black};
} else {
int cyan = 255 - red;
int magenta = 255 - green;
int yellow = 255 - blue;
return new int[] {cyan,magenta,yellow,black};
}
}
public static int[] cmykToRgb(int cyan, int magenta, int yellow, int black)
{
if (black!=255) {
int R = ((255-cyan) * (255-black)) / 255;
int G = ((255-magenta) * (255-black)) / 255;
int B = ((255-yellow) * (255-black)) / 255;
return new int[] {R,G,B};
} else {
int R = 255 - cyan;
int G = 255 - magenta;
int B = 255 - yellow;
return new int[] {R,G,B};
}
}发布于 2011-02-01 19:19:50
正如Lea Verou所说,您应该利用颜色空间信息,因为没有从RGB到CMYK的映射算法。Adobe有一些ICC颜色配置文件可供下载1,但我不确定它们是如何授权的。
一旦你有了颜色配置文件,像下面这样的东西就可以完成这项工作:
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ICC_Profile;
import java.io.IOException;
import java.util.Arrays;
public class ColorConv {
final static String pathToCMYKProfile = "C:\\UncoatedFOGRA29.icc";
public static float[] rgbToCmyk(float... rgb) throws IOException {
if (rgb.length != 3) {
throw new IllegalArgumentException();
}
ColorSpace instance = new ICC_ColorSpace(ICC_Profile.getInstance(pathToCMYKProfile));
float[] fromRGB = instance.fromRGB(rgb);
return fromRGB;
}
public static float[] cmykToRgb(float... cmyk) throws IOException {
if (cmyk.length != 4) {
throw new IllegalArgumentException();
}
ColorSpace instance = new ICC_ColorSpace(ICC_Profile.getInstance(pathToCMYKProfile));
float[] fromRGB = instance.toRGB(cmyk);
return fromRGB;
}
public static void main(String... args) {
try {
float[] rgbToCmyk = rgbToCmyk(1.0f, 1.0f, 1.0f);
System.out.println(Arrays.toString(rgbToCmyk));
System.out.println(Arrays.toString(cmykToRgb(rgbToCmyk[0], rgbToCmyk[1], rgbToCmyk[2], rgbToCmyk[3])));
} catch (IOException e) {
e.printStackTrace();
}
}
}发布于 2011-02-01 10:05:36
要像Photoshop那样准确地将值从RGB转换为CMYK,反之亦然,您需要使用ICC颜色配置文件。你将在互联网上找到的所有简单的算法解决方案(如上面发布的)都是不精确的,并且产生CMYK色域之外的颜色(例如,它们将CMYK(100,0,0,0)转换为rgb(0,255,255),这显然是错误的,因为rgb(0,255,255)不能用CMYK重现)。查看java.awt.color.ICC_ColorSpace和java.awt.color.ICC_Profile类,以便使用ICC颜色配置文件转换颜色。至于颜色配置文件本身,Adobe免费分发它们。
发布于 2012-08-25 09:29:02
一种更好的方法:
try {
// The "from" CMYK colorspace
ColorSpace cmykColorspace = new ICC_ColorSpace(ICC_Profile.getInstance("icc/CoatedFOGRA27.icc"));
// The "to" RGB colorspace
ColorSpace rgbColorspace = new ICC_ColorSpace(ICC_Profile.getInstance("icc/AdobeRGB1998.icc"));
// Bring in to CIEXYZ colorspace (refer to Java documentation: http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/color/ColorSpace.html)
float[] ciexyz = cmykColorspace.toCIEXYZ(cmyk);
float[] thisColorspace = rgbColorspace.fromCIEXYZ(ciexyz);
float[] rgb = thisColorspace;
Color c = new Color(rgb[0], rgb[1], rgb[2]);
// Format RGB as Hex and return
return String.format("#%06x", c.getRGB() & 0xFFFFFF);
} catch (IOException e) { e.printStackTrace(); }https://stackoverflow.com/questions/4858131
复制相似问题