2013-03-04 3 views
2

지난 주부터 색상 변환을 위해 Windows 색상 시스템을 사용하려고합니다.색상 변환 CMYK - RGB - ICC 프로파일을 사용하여 WCS가있는 연구소

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

I를 - 결과 내가 실험실 값에 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); 

, 그때 내가 잘못된 연구소를 얻을 : CMYK의 변환에 의해 내가 올바른 값을 얻을 RGB로 CMYK 값으로 변환 (0, 0 0 0) RGB (= 254 : 254; 254)와 나는 다음과 같은 값을 얻을 연구소에 RGB 값 :

L = 0.0039978637360036373 
a = 0.002777141984552145 
b = 0.0030670634005218744 

그러나 L-값이 있어야 할 약 100 %

+0

문제를 해결하기 위해 여기에 그냥 충분한 정보가있다. 'TranslateColors'는 어떻게 생겼습니까? 'GetStandardColorSpaceProfile'은 어떻습니까? CMYK를 LAB로 변환하는 일반적인 질문을하는 것이 훨씬 낫습니다. –

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

실험실 색상에 대해 'ISOcoated_v2_300_eci.icc'색상 프로파일이 작동하지 않는다고 생각합니다. 아마 CMYK에서 RGB 로의 변환 (및 그 반대) 변환 만 지원합니다. 아마도 Lab 색상에 대한 특정 프로필이 필요할 것입니다. – Codo

답변

0

흠. 컬러 모니터 (RGB)에서 장치 독립적 인 컬러 모델 (Lab)로 변환 할 때 인쇄 프로파일 (CMYK)을 사용할 필요가 없다고 생각합니다.

RGB -> XYZ -> Lab 또는 this