最好是对CMYK低分辨率支持的比较好的,因为我这里要求是CMYK每种颜色都量化成8个色阶。
下面是我的代码,RGB转成CMYK后再转回来失真严重。
void CMy3View::RGB2CMYK(int red, int green, int blue, int &C, int &M, int &Y, int &K) //RGB转CMYK
{
double c,m,y,k;
c = (double)(255 - red) / 255;
m = (double)(255 - green) / 255;
y = (double)(255 - blue) / 255;
if(c<=m&&c<=y) //k赋值为c,m,y的最小值
k=c;
else if(m<=c&&m<=y)
k=m;
else
k=y;
if(1.0 == k)
c = m = y = 0;
else{
c = (c - k) / (1 - k);
m = (m - k) / (1 - k);
y = (y - k) / (1 - k);
}
C=(int)8.0*c; //不要问我为什么这里要乘8,要求就是CMYK只有8个色阶,必须得
M=(int)8.0*m; //这么做
Y=(int)8.0*y;
K=(int)8.0*k;
}
void CMy3View::CMYK2RGB(int c, int m, int y, int k, int &r, int &g, int &b) //CMYK转RGB
{
r =(int)(1.0-c/8.0)*(1.0-k/8.0)*255.0 +0.5;
g =(int)(1.0 - m/8.0) * (1.0 - k/8.0) * 255.0+0.5;
b =(int)(1.0 - y/8.0) * (1.0 - k/8.0) * 255.0+0.5;
}