10

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

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

解决方案 1 - 使用 .NET Framework

起初,我遵循了这些步骤

  • 从Adob​​e下载 ICC 配置文件(Windows 版)

  • 转换#color 为 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

  • 使用 Adob​​e Photoshop 转换的结果(相同的配置文件):#3b4996 甚至没有关闭!

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

我也用相同的程序尝试了Codo 的解决方案

这是结果:

  • 轮廓 :CoatedFOGRA27.icc

  • 原色:#2f00ff

  • 转换颜色:#2032FF

  • Photoshop:#3b4996

用于比较的 JSFiddle

编辑

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

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

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

例如

  • RGB 十六进制:#2F00FF

  • RGB:47 - 0 - 255

  • 三色卡:0,816 - 1,000 - 0,000 - 0,000

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

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

编辑 2

在此处输入图像描述

4

3 回答 3

7

让我尝试帮助您解决所有问题:

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

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

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

让我们继续:

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

54,81,70 用于红色 RGB,即 (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 和 (2) 特定打印机中的 CMYK 红色提供表格,为 RED 提供了一个标准。

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

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

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

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

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

于 2013-08-25T04:56:04.360 回答
4

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

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
于 2013-08-26T17:16:06.057 回答
3
于 2013-08-17T04:58:26.747 回答