如何在indesign中以编程方式将CMYK转换为RGB

我在indesign中有一个CMYK颜色空间,我想将其转换为RGB颜色空间,我有一些代码,但我收到的数据不正确。

我试过的一些代码如下

double cyan = 35.0; double magenta = 29.0; double yellow = 0.0; double black = 16.0; cyan = Math.min(255, cyan + black); //black is from K magenta = Math.min(255, magenta + black); yellow = Math.min(255, yellow + black); l_res[0] = 255 - cyan; l_res[1] = 255 - magenta; l_res[2] = 255 - yellow; 

 @Override public float[] toRGB(float[] p_colorvalue) { float[] l_res = {0,0,0}; if (p_colorvalue.length >= 4) { float l_black = (float)1.0 - p_colorvalue[3]; l_res[0] = l_black * ((float)1.0 - p_colorvalue[0]); l_res[1] = l_black * ((float)1.0 - p_colorvalue[1]); l_res[2] = l_black * ((float)1.0 - p_colorvalue[2]); } return (l_res); } 

CMYK颜色空间中的值是C = 35,M = 29,Y = 0,K = 16,并且正确的RGB值是R = 142,G = 148,B = 186。

在adobe indesign中,使用色板我们可以将模式更改为CMYK或RGB。

但我想以编程方式进行,我可以使用任何算法将CMYK转换为RGB,这将提供正确的RGB值。

还有一个问题,如果RGB的alpha值是1,那么CMYK的alpha值是多少?

任何人都可以帮我解决这些问题……提前谢谢。

回答你的上一个问题:

如果在RGB颜色空间中alpha为1,则在CMYK颜色空间中为1。 两个空格都只是指定颜色,而不是透明度。

关于你的CMYK到RGB转换问题,你应该注意到

CMYK和RGB模型之间没有精确的转换 – 两个颜色空间都覆盖不同的色域

资源

这个维基百科页面上也有讨论

颜色是主观的。

将CMYK转换为RGB时,有直接转换公式,正如您已经发现并且似乎有代码。 然而,它们太精确了。

当从CMYK转换为RGB时,您需要使用color profile来描述CMYK墨水将被放置的设备和基板。

因此:

  1. 你有image.tif这是一个CMYK图像。
  2. 您需要应用描述该映像的预期输出设备的ICC配置文件。 (即USWebCoatedSWOP.icc用于在柔性版印刷机上使用涂层基材创建图像。)

按照这些步骤将获得正确的彩色图像和“正确”RGB值。

因此,将这些知识应用于您的情况,您需要以编程方式应用ICC配置文件。

如果你坚持自己做数学,( 我建议你避免这个!!! )你可以在ICC网站上阅读所有相关内容或使用LittleCMS自己编写代码。

我不相信通过InDesign公开基于COM的编程接口。 但是,Photoshop,Illustrator和Acrobat都会公开一些基于COM的API。

我不知道使用Adobe公开的API调用是否可行,但是,我可以说可以通过CorelDRAW以编程方式执行此操作 。

编辑:显然, InDesign确实具有自动化function ,但是,我找不到任何以编程方式应用颜色配置文件的function。 见(1.5.9。颜色)部分。

你拥有的只是四个数字(对于CMYK),你想从中得到三个数字(对于RGB)。

不幸的是,你的数字只是 – 数字。 要指定颜色,需要超过四倍或三倍。 有多种方法可以做到这一点,但最广泛使用的是ICC架构(参见www.color.org),使用色彩空间,轮廓连接空间,渲染意图,照明条件等概念。非常简单的术语:您需要一个源配置文件来描述您来自的CMYK号码,以及您希望从您的四个数字中获得的RGB的目标配置文件。 然后,您可以使用基于ICC的颜色转换技术(如开源LittleCMS库,或Mac OS,Windows OS或各种Adobe产品中内置的类似function)来执行转换。

看起来你想要匹配其他地方发现的行为 – 除非你发现其他地方发现的“行为”正是在完成它的工作,否则很难找到一种精确匹配它的方法。 不幸的是,许多“行为”基本上没有明确规定或记录不足。

如果你能详细说明你为什么要做你做的事情,可能会提出一些有用的建议。

 double cyan = 35.0/100.0; double magenta = 29.0/100.0; double yellow = 0.0; double black = 16.0/100.0; 

首先,你将每个值除以100,因为它的范围是0到1

  R=255*(1-cyan)*(1-black); G=255*(1-magneta)*(1-black); B=255*(1-yellow)*(1-black); 

通过这种方式,我们将获得几乎近似的值

如果您使用的是InDesign脚本,为什么要自己转换颜色? 只需要求InDesign为您完成。

app.colorTransform(源颜色空间中的数字数组,源颜色空间,目标颜色空间);

上面的代码将返回一个数字数组,表示目标颜色空间中的颜色。 试一试。