【问题标题】:Converting RGB to CMYK , Using ICC Profile使用 ICC 配置文件将 RGB 转换为 CMYK
【发布时间】:2013-08-18 19:54:33
【问题描述】:

我即将将 RGB 颜色转换为 CMYK 以进行打印。 此转换的规模是 Adob​​e Photoshop ( Image -> Mode -> CMYK color )

我尝试了 2 个解决方案,但都没有返回正确的值:

解决方案 1 - 使用 .NET Framework

一开始,我遵循了这些步骤

  • Adobe下载ICC配置文件(windows版本)

  • 转换#colorto CMYK

  • 使用System.Windows.Media.Color.FromValues // return ColorMSDN

  • string convretedColor = string.Format("#{0:X2}{1:X2}{2:X2}", _color.R, _color.G, _color.B)

结果如下:

  • 个人资料:CoatedFOGRA27.icc

  • 原色:#2f00ff

  • 转换后的颜色:#3b4996

  • 使用 Adob​​e Photoshop 转换的结果(相同的配置文件):#3b4996not even close!

解决方案 2 - 使用 Windows 颜色系统 (WCS)

我也尝试了Codo's solution 用同样的程序

结果如下:

  • 个人资料:CoatedFOGRA27.icc

  • 原色:#2f00ff

  • 转换后的颜色:#2032FF

  • Photoshop:#3b4996

JSFiddle for compare

编辑

根据 Codo 的评论,我认为我在理解颜色概念方面存在一些基本问题! (如有错误请指正)

对于任何颜色,我们都有不同的颜色模型,RGBCMYK,...

RGB 显示 (Red Green Blue) 的组合以生成颜色和 CMYK 以及 (Cyan Magenta Yellow * )。这些模型的值可以很容易地相互转换。

for example

  • RGB 十六进制:#2F00FF

  • RGB:47 - 0 - 255

  • CMYK:0,816 - 1,000 - 0,000 - 0,000

几乎所有显示器都使用RGB来显示颜色。打印的颜色(因为使用Ink而不是LED o ...)与您在显示器上看到的颜色完全不同/

对于这个问题,像Photoshop这样的图像编辑器使用CMYK **MODE**。在这种模式下,如果您选择RGB颜色,编辑器会将其转换为您打印后看到的颜色并显示到屏幕上。这种转换是绝对的取决于颜色配置文件(此处为 ICC)

编辑 2

【问题讨论】:

  • 所有这些颜色值中的哪一个应该是 CMYK 值?如果目标似乎是不支持 CMYK 的 HTML,为什么还要尝试转换为 CMYK?
  • @Codo,故事是:最终用户选择 RGB 颜色,我使用 HEX 将颜色传递给服务器。在回帖中,我想显示他选择的converted-to-CMYK 颜色!在 Photoshop 中,当您设置Mode > CMYK 并选择并填充#2f00ff 时,结果为#3b4996
  • 我不明白(而且我没有安装 Photoshop)。你的颜色值(#xxxxxx)应该是什么?在我看来,它们都像 RGB 值。 CMYK 值在哪里?
  • @Codo 请重新检查问题[编辑段]
  • 我还是不明白你想要达到什么目的。你能更好地描述你在做什么,你期望得到什么以及你有效地得到什么。而且我希望您需要 RGB 到 CMYK 和 CMYK 到 RGB 的转换。但我看不到 CMYK 到 RGB 的转换。

标签: c# colors converter cmyk color-profile


【解决方案1】:

让我试着帮你整理一下:

1) RGB 是一种描述颜色值的格式。即:红色为 255,0,0。

2) HSV 是另一种描述颜色值的格式。即:红色为 0,100,100

只有这两个可以为您提供数字准确的颜色
您可以将它们视为颜色的数字表示,或者它是真正的 DNA,感谢上帝,显示器能够呈现它们 - 正是它们的本来面目。

让我们继续:

3) Lab 是另一种描述颜色值的格式。

红色 RGB 为 54,81,70,但为 (255,0,0)..
54,81,70也可以适用于不同的RGB..(254,0,0)

这是为什么呢?因为 Lab 格式旨在逼近人类视觉。
对于人眼来说,(255,0,0) 和 (254,0,0) 之间没有区别
好吧..对于人眼来说并不是很准确..
更准确地说是用于获取 Lab 颜色的模型。

4) CYMK 旨在告诉打印机将青色、黄色和品红色的什么混合物压到纸上,K(键或黑色)告诉打印机要压入该混合物的深浅。

所以 0%,100%,100%,0% 会给我们红色的混合物..
和 0%,50%,50%,0% 会给我们粉红色。

让我们继续:

您的工作是将显示器中看到的 RGB 调整为打印机的 CMYK。
天知道你为什么要这样做,因为它已经完全自动并由驾驶员处理多年......
但我想你有你的理由,所以让我们继续吧,
每台打印机都有稍微不同的 CMYK 值来混合以获得特定的红色..

这就是 ICC 配置文件发挥作用的地方..
例如,他们通过为 (1) 原始 RGB-RED 提供表格来给出 RED 的标准 (2) 特定打印机中的 CMYK 红色。

因此,根据 ICC 配置文件从 RGB(红色)转换为 CMYK(红色)是合乎逻辑的。

但如果您尝试转换回来 - 您会注意到根据特定配置文件的 CMYK for RED 可以有多个数字 RED 值..

这是因为数字色彩分辨率比现有的要准确得多 一张打印的纸,另一种看待它的方式是说特定的打印机 ICC 可能是在 Lab 上构建的。

现在我知道了……我知道了……你可能已经知道了大部分,如果不是全部的话。
(我写它只是为了确保我们都在书中的同一页上。)

所以,当您说“它们都没有返回正确的值”时 (假设他们=转换)你到底是什么意思?! 在我看来一切都是正确的,因为事实上它们确实返回了正确的值 - 用于打印目的。

【讨论】:

  • 亲爱的 G.V:哇!我正在尝试开发一个打印服务网站。客户从颜色选择器中选择RGB-RED作为纸张背景。他希望提供与他选择的相同的RED。对于这个问题,我们将RGB-RED颜色发布到服务器并将其转换为具有特定ICC的CMYK (根据我的解决方案)并将其回贴给客户并替换为他的RGB-RED 并提醒他注意新颜色! 现在问题:Project Owner 启动此过程并单击PrintSCR 再用Photoshop 比较转换后的颜色!不幸的是结果不相等。
  • 现在好多了:) 所以当您的客户选择纸张背景颜色时,他会选择 RGB 并且您希望根据特定的 ICC 配置文件将其转换为 cmyk。一切都很好.. 只有一件事.. 谁说 Photoshop 对 CMYK 的解释是正确的?我们已经建立了一个 CMYK 红色可以包含许多 RGB 红色。那么,究竟谁会说选择展示的那一款 Photoshop 是最好的那一款呢?即:在 Photoshop 颜色选择器中选择 rgb(186,72,190) -> 和 printScr,现在打开paint.Net 并在其颜色选择器中采样该颜色,p.net 显示 rgb(186,71,190).. PS 完全错误。跨度>
  • 说服Product Owners 你的引擎比Porsche 工作得更好!!!不可能 ;) 我找到了Adobe Color Management。我正在努力……
  • 令人兴奋 :P Adob​​e 终于明白它的颜色管理模块存在故障,除了由于颜色范围的差异而导致转换存在自然增量的事实。所以它试图将其模块建立为转换的行业标准.. 好吧,它会解决你的问题 :)
  • 不,绝对绝对不! RGB 不是数字绝对或准确的颜色,恰恰相反。您对 R255 G0 B0 三元组的实际红色一无所知,仅表示它通常应该是某种红色。 RGB 三元组只有在与描述您实际指代的颜色空间的颜色配置文件一起使用时才有意义。
【解决方案2】:

可能是这个(未经测试的)sn-p 有点帮助 - 它使用.NET api 代替ImageMagick

MagickReadSettings settings = new MagickReadSettings();
settings.ColorSpace = ColorSpace.CMYK;
using (MagickImage image = new MagickImage())
{
  image.AddProfile(ColorProfile.CMYK);
  image.Read("image_rgb.tiff", settings);
  image.Write("image_cmyk.tiff");
}

如果您可以使用命令行,这也可以完成这项工作:

convert image_rgb.tiff -profile "RGB.icc" -profile "CMYK.icc" image_cmyk.tiff

【讨论】:

  • 这个解决方案救了我的命!距离开发截止日期还有 2 小时,我开始担心。我花了几天时间尝试在 C# 中将 RGB 转换为 CMYK,然后我找到了这个解决方案,它在几分钟内就起作用了。谢谢!
【解决方案3】:

正如我所看到的理论......

CMYK 本身的色域略小于 RGB,所以直接 RGB->CMYK 转换后的差异会很容易看出。为了补偿差异颜色配置文件被使用。里面的颜色配置文件实际上是一组颜色转换,可以扩大色域。在这种情况下,图像源只是这些变换的源。

CMYK 几乎总是与颜色配置文件一起使用(我的意思是正确的用例),否则颜色损失会很严重。

在 Photoshop 中尝试在此处转换:编辑 -> 转换为配置文件。与您的方式的主要区别 - 您可以选择目标 CMYK 配置文件和色彩管理引擎,包括 Microsoft ICM,这可能会给您带来不同的结果。

这是一篇关于 CMYK 的好文章:http://www.northlight-images.co.uk/article_pages/colour_management/cmyk_for_photographers.html

至于编程……

也许使用一些专门的图像处理 SDK 会更容易。颜色管理是其中任何一个的基本功能,甚至应该免费提供。

如果您需要估计 RGB 颜色的实际打印方式,您需要使用称为“软打样”的功能。这是 RGB -> CMYK(带有打印机配置文件)-> RGB 转换。在 Photoshop 中,您可以在此处查看:查看 -> 校样颜色。您可以使用 SDK 做同样的事情。

【讨论】: