首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RGB到CMYK和back算法

RGB到CMYK和back算法
EN

Stack Overflow用户
提问于 2011-02-01 09:56:03
回答 6查看 33.4K关注 0票数 10

我正在尝试实现一个解决方案,用于计算RGB和CMYK之间的转换,反之亦然。这是我到目前为止所知道的:

代码语言:javascript
复制
  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};
        }
    }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-02-01 19:19:50

正如Lea Verou所说,您应该利用颜色空间信息,因为没有从RGB到CMYK的映射算法。Adobe有一些ICC颜色配置文件可供下载1,但我不确定它们是如何授权的。

一旦你有了颜色配置文件,像下面这样的东西就可以完成这项工作:

代码语言:javascript
复制
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();
        }
    }
}
票数 7
EN

Stack Overflow用户

发布于 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_ColorSpacejava.awt.color.ICC_Profile类,以便使用ICC颜色配置文件转换颜色。至于颜色配置文件本身,Adobe免费分发它们。

票数 8
EN

Stack Overflow用户

发布于 2012-08-25 09:29:02

一种更好的方法:

代码语言:javascript
复制
    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(); }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4858131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档