【发布时间】:2014-06-01 02:52:42
【问题描述】:
如果这个函数做了我认为它做的事情,似乎在我的机器上至少在 CMYK 中,C=0、M=0、Y=0 和 K=0 不对应白色!有什么问题?
float *arr 是一个带有 size 元素的浮点数组。我想根据需要将此数组保存为带有IJG 的libjpeg 在两个颜色空间中的JPEG:g:灰度和c:CMYK。我按照他们的示例,根据颜色空间使用JSAMPLE 元素的数量输入JSAMPLE *jsr 数组:size 元素用于灰度,4*size 元素用于 CMYK。 JSAMPLE 至少在我的机器上只是 unsigned char 的另一个名称。完整程序可见on Github。这就是我填写jsr的方式:
void
floatfilljsarr(JSAMPLE *jsr, float *arr, size_t size, char color)
{
size_t i;
double m;
float min, max;
/* Find the minimum and maximum of the array:*/
fminmax(arr, size, &min, &max);
m=(double)UCHAR_MAX/((double)max-(double)min);
if(color=='g')
{
for(i=0;i<size;i++)
jsr[i]=(arr[i]-min)*m;
}
else
for(i=0;i<size;i++)
{
jsr[i*4+3]=(arr[i]-min)*m;
jsr[i*4]=jsr[i*4+1]=jsr[i*4+2]=0;
}
}
我应该注意到color 在此函数之前已被检查为c 或g。
然后我完全按照libjpeg 的源代码中的example.c 程序编写JPEG 图像。
这是在 TeX 文档中打印两个图像后的输出。灰度在左侧,CMYK 在右侧。两个图像都是由同一个有序数组组成的,所以左下元素(数组中的第一个,我已经定义并在此处显示)的 JSAMPLE 值为 0,右上元素的 JSAMPLE 值为 255。
为什么两张图片不相似?由于性质不同,我希望 CMYK 图像会反转,底部是亮的,顶部是黑色的。它们显示的 JSAMPLE 值(唯一的灰度值和 CMYK 中的 K 通道)是相同的,但是我得到的这个输出不是我所期望的! CMYK 图像也更亮到顶部,但非常微弱!
似乎 C=0, M=0, Y=0 和 K=0 至少在这个算法和我的机器上不对应白色!?!当我只改变K通道而其余保持为零时,如何设置白色?
【问题讨论】:
标签: c jpeg grayscale libjpeg cmyk