颜色转换CMYK - RGB -实验室与WCS使用ICC配置文件

本文关键字:使用 WCS ICC 配置文件 实验室 转换 CMYK RGB 颜色 | 更新日期: 2023-09-27 18:02:21

从上周开始,我尝试使用Windows颜色系统进行颜色转换。通过从CMYK到RGB的转换,我得到了正确的值:

    // Example CMYK - VALUES with 0
    float[] cmykValues = new float[4];
    cmykValues[0] = 0f / 255f;
    cmykValues[1] = 0f / 255f;
    cmykValues[2] = 0f / 255f;
    cmykValues[3] = 0f / 255f;
    System.Windows.Media.Color color = Color.FromValues(cmykValues, new Uri(@"ISOcoated_v2_300_eci.icc"));
    System.Drawing.Color rgbColor = System.Drawing.Color.FromArgb(color.R, color.G, color.B);

当我尝试将RGB值转换为实验室值时,我会得到一个不正确的实验室-结果:

[StructLayout(LayoutKind.Sequential)]
public struct RGBColor
{
    public ushort red;
    public ushort green;
    public ushort blue;
    public ushort pad;
};
[StructLayout(LayoutKind.Sequential)]
public struct LABColor
{
    public ushort L;
    public ushort a;
    public ushort b;
    public ushort pad;
};
 StringBuilder profileName = new StringBuilder(256);
 uint size = (uint)profileName.Capacity * 2;
 success = GetStandardColorSpaceProfile(0, LogicalColorSpace.sRGB, profileName, ref size);
 ProfileFilename sRGBFilename = new ProfileFilename(profileName.ToString());
 IntPtr hSRGBProfile = OpenColorProfile(sRGBFilename, ProfileRead, FileShare.Read, CreateDisposition.OpenExisting);
 ProfileFilename isoCoatedFilename = new ProfileFilename(@"ISOcoated_v2_300_eci.icc");
 IntPtr hIsoCoatedProfile = OpenColorProfile(isoCoatedFilename, ProfileRead, FileShare.Read, CreateDisposition.OpenExisting);
 IntPtr[] profiles = new IntPtr[] { hSRGBProfile, hIsoCoatedProfile };
 uint[] intents = new uint[] { IntentPerceptual };
 IntPtr transform = CreateMultiProfileTransform(profiles, 2, intents, 1, ColorTransformMode.BestMode, IndexDontCare);
 RGBColor[] rgbColors = new RGBColor[1];
 rgbColors[0] = new RGBColor();
 LABColor[] labColors = new LABColor[1];
 labColors[0] = new LABColor();
 rgbColors[0].red    = Convert.ToUInt16(rgbColor.R * 257);
 rgbColors[0].green  = Convert.ToUInt16(rgbColor.G * 257);
 rgbColors[0].blue   = Convert.ToUInt16(rgbColor.B * 257);
 success = TranslateColors(transform, rgbColors, 1, ColorType.RGB, labColors, ColorType.Lab);
 double colorL = Convert.ToDouble(labColors[0].L) / 65535;
 double colorA = Convert.ToDouble(labColors[0].a) / 65535;
 double colorB = Convert.ToDouble(labColors[0].b) / 65535;

当我将CMYK值(0;0;0;0)转换为RGB(= 254:254;254)和RGB值转换为Lab时,我得到以下值:

L = 0.0039978637360036373
a = 0.002777141984552145
b = 0.0030670634005218744

但是l值应该是100%

颜色转换CMYK - RGB -实验室与WCS使用ICC配置文件

我认为当从彩色显示器(RGB)转换为设备独立的颜色模型(Lab)时,您不需要使用打印配置文件(CMYK)。

RGB -> XYZ -> Lab or this