C# 颜色转换CMYK-RGB-Lab与WCS通过使用ICC配置文件

C# 颜色转换CMYK-RGB-Lab与WCS通过使用ICC配置文件,c#,dll,colors,type-conversion,color-profile,C#,Dll,Colors,Type Conversion,Color Profile,从上周开始,我尝试使用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 / 255

从上周开始,我尝试使用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%

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


或者

这里没有足够的信息来解决这个问题。
translateColor
看起来像什么?那么
GetStandardColorSpaceProfile
呢?你最好问一个关于将CMYK转换成实验室的一般性问题。我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。我认为颜色配置文件
ISOcoated\u v2\u 300\u eci.icc
不适用于实验室颜色。它可能只支持CMYK到RGB(反之亦然)的转换。您可能需要实验室颜色的特定配置文件。@RichardJ.RossIII TranslateColors函数将颜色数组从源颜色空间转换到由颜色转换定义的目标颜色空间。GetStandardColorSpaceProfile函数检索为指定的标准颜色空间注册的颜色配置文件。@Codo我用不同的配置文件进行了尝试。我总是得到不同的价值观。因此,我认为配置文件支持实验室颜色。我认为DLL将返回一个错误或静态0值。不是吗?谢谢你的回答!