2013-03-04 58 views
2

由于上周我尝试使用Windows颜色系统进行颜色转换。通过从CMYK转换为RGB我得到正确的值:色彩转换CMYK - RGB - 通过使用ICC配置文件的WCS实验室

// 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值转换为Lab值,然后我得到一个不正确实验室 - 结果:

[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%

+0

只是有没有足够的信息在这里解决问题。 'TranslateColors'看起来像什么? “GetStandardColorSpaceProfile”怎么样?你最好问一个关于将CMYK转换为LAB的通用问题。 – 2013-03-04 14:24:47

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-03-04 14:29:06

+0

我不认为颜色配置文件'ISOcoated_v2_300_eci.icc'适用于实验室颜色。它可能只支持CMYK到RGB(反之亦然)转换。您可能需要Lab颜色的特定配置文件。 – Codo 2013-03-04 14:33:57

回答

0

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

RGB -> XYZ -> Labthis

相关问题