当前位置: 首页 > 面试题库 >

RGB转CMYK和反向算法

侯博裕
2023-03-14
问题内容

我正在尝试实现一种解决方案,用于计算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};
        }
    }

问题答案:

正如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();
        }
    }
}


 类似资料:
  • 我正在尝试使用Latex创建PDF文件。但是,Latex不处理TIFF或任何其他能够同时透明和CMYK的图像格式。我认为我可以使用的唯一解决方案是将PNG图像转换为PDF并将其嵌入到文件中。 我对imagemagick有点熟悉,但是,我不知道如何将PNG(可能在RGB/SRGB颜色空间中)转换为CMYK颜色空间中的PDF。 我如何进行这种转换,使颜色正确,透明度保持不变?

  • 问题内容: 如果我有RGB小数,例如,我该怎么做才能将其转换为CMYK? 例如: 问题答案: 这是Javascript实现的Python端口。

  • 问题内容: 我需要将图像从CMYK转换为RGB-不必再次返回,但是,嘿,如果可以的话… 随着ColdFusion 8的发布,我们获得了CFImage标签,但是它不支持这种转换。而且Image.cfc或Alagad的Image Component 也不会。 但是,在Java中应该可以实现。我们可以通过CF加以利用。例如,以下是创建Java线程以使进程休眠的方法: 我猜想可以使用类似的方法来利用Jav

  • 问题内容: 我很难让ImageMagick 识别PDF为CMYK。 从本质上讲,让我们说我建这个文件,具有: 如果我随后尝试标识生成的文件,则无论我尝试了什么选项(至少根据源中的链接),我都将其获取为RGB -但是,其中的颜色将另存为CMYK。对于以上来源: 如果我也取消注释该 部分,则几乎会发生同样的情况。但是,如果文档中只有一种颜色(黑色),我看不到RGB值的直方图在哪里出现(尽管可以说所有这

  • 前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度。基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使用数学和计算图(computationa

  • 我目前正在编码一个colorpicker并尝试创建一个函数,它需要3个介于0和255(RGB)之间的整数。 如果你看上面链接的图像,你可以看到在中心有一个彩虹-渐变。上面的所有RGB值至少包含一个0和一个255的整数。另一个可以是0到255之间的任何值。然后在图像的左边有一个正方形,它包含这个“彩虹颜色”的所有“子颜色”的渐变。 函数应该取这个子颜色的RGB值(例如,R=112,G=158,B=7