使用ICC配置文件将RGB转换为CMYK

时间:2013-08-16 11:57:13

标签: c# colors converter cmyk color-profile

我即将RGB颜色转换为CMYK用于打印目的。 此转换的比例是Adobe Photoshop ( Image -> Mode -> CMYK color )

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

解决方案1 ​​ - 使用.NET Framework

首先,我接着执行了这些步骤

  • Adobe

  • 下载ICC配置文件(Windows版本)
  • 转换#color to CMYK

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

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

结果如下:

  • 个人资料:CoatedFOGRA27.icc

  • 原色:#2f00ff

  • 转换后的颜色:#3b4996

  • 转换结果使用Adobe Photoshop(相同的个人资料):#3b4996 not even close!

解决方案2 - 使用Windows Color System(WCS)

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

结果如下:

  • 个人资料:CoatedFOGRA27.icc

  • 原色:#2f00ff

  • 转换后的颜色:#2032FF

  • Photoshop:#3b4996

JSFiddle for compare

修改

根据Codo的评论,我认为,我有一些理解颜色概念的基本问题! (如果我错了,请纠正我)

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

RGB显示(红绿蓝)组合产生颜色和CMYK(青色洋红黄色*)。这些模型的值可以很容易地转换为彼此。

for example

  • RGB HEX:#2F00FF

  • RGB:47 - 0 - 255

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

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

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

编辑2

enter image description here

3 个答案:

答案 0 :(得分:8)

让我试着帮助你解决所有问题:

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

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

这两个是唯一会给你数字准确颜色的
您可以将它们视为颜色的数字表示,或者它是真正的DNA,感谢上帝,显示器能够呈现它们 - 完全是为了它们。

让我们继续前进:

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

红色RGB为541,而不是(255,0,0) 54,61,70也可以应用于不同的RGB ..(254,0,0)

为什么?因为Lab格式旨在接近人类视觉。
对于人眼而言,(255,0,0)和(254,0,0)之间没有区别 嗯...对于人眼来说并不是很准确。
更准确地说,正用于获得实验室颜色的模型...

4)CYMK的设计目的是告诉打印机将青色,黄色和洋红色的混合物压在纸上,然后用K(键或黑色)压入多少黑色进入混合物。

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

让我们继续前进:

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

这就是ICC简介发挥作用的地方..
他们通过提供(1)原始RGB-RED的表格为RED提供标准 (2)特定打印机中的CMYK红色。

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

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

这是因为数字色彩分辨率比出来的更准确 打印纸,另一种看待它的方法是说特定的打印机ICC可以建立在Lab上。

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

所以,当你说“他们都没有返回正确的价值”时 (假设他们=转换)你究竟是什么意思?! 对我来说似乎都是正确的,因为实际上它们确实会返回正确的值 - 用于打印目的。

答案 1 :(得分:4)

我看到理论......

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执行相同的操作。

答案 2 :(得分:2)

这个(未经测试的)代码段可能会有所帮助 - 它使用.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