RGB与CMYK互转
先定义一个CMYK数据结构:
typedef struct struCMYK
{int m_nC;int m_nM;int m_nY;int m_nK;
}CMYK;
RGB转CMYK
void CvtRGB2CMYK(COLORREF& clr, CMYK& cmyk)
{double dR = GetBValue(clr) / 255.0;double dG = GetGValue(clr) / 255.0;double dB = GetRValue(clr) / 255.0;double dC, dM, dY;double dK = 1 - max(dR, dG, dB);if (dK == 1.0){dC = 0.0;dM = 0.0;dY = 0.0;}else{dC = (1 - dR - dK) / (1 - dK);dM = (1 - dG - dK) / (1 - dK);dY = (1 - dB - dK) / (1 - dK);}cmyk.m_nC = (int)(dC * 100);cmyk.m_nM = (int)(dM * 100);cmyk.m_nY = (int)(dY * 100);cmyk.m_nK = (int)(dK * 100);
}
CMYK转RGB
void CvtCMYK2RGB(CMYK& cmyk, COLORREF& clr)
{double dK = cmyk.m_nK / 100.0;double dC = cmyk.m_nC / 100.0;double dM = cmyk.m_nM / 100.0;double dY = cmyk.m_nY / 100.0;double dR = (1 - dK) * (1 - dC);double dG = (1 - dK) * (1 - dM);double dB = (1 - dK) * (1 - dY);int nR = dR * 255;int nG = dG * 255;int nB = dB * 255;SStringW sstrClr;sstrClr.Format(L"rgb(%d,%d,%d)", nR, nG, nB);clr = GETCOLOR(sstrClr);
}
这种处理方式的不足之处是RGB与CMYK在互转过程中会损失精度。