在c中使用libjpeg在CMYK中保存灰度
如果这个函数和我想的一样,那么在我的机器上,至少在CMYK中,C=0,M=0,Y=0和K=0与白色不对应!有什么问题在c中使用libjpeg在CMYK中保存灰度,c,jpeg,grayscale,libjpeg,cmyk,C,Jpeg,Grayscale,Libjpeg,Cmyk,如果这个函数和我想的一样,那么在我的机器上,至少在CMYK中,C=0,M=0,Y=0和K=0与白色不对应!有什么问题 float*arr是一个带有size元素的浮点数组。我想根据需要在两个颜色空间中将此数组保存为带有“libjpeg”的JPEG格式:g:灰度和c:CMYK。我按照他们的示例,使用jssample元素的数量(取决于颜色空间)创建输入jssample*jsr数组:size元素用于灰度,而4*size元素用于CMYKJSAMPLE至少在我的机器上是unsigned char的另一个名称
float*arr
是一个带有size
元素的浮点数组。我想根据需要在两个颜色空间中将此数组保存为带有“libjpeg”的JPEG格式:g
:灰度和c
:CMYK。我按照他们的示例,使用jssample
元素的数量(取决于颜色空间)创建输入jssample*jsr
数组:size
元素用于灰度,而4*size
元素用于CMYKJSAMPLE
至少在我的机器上是unsigned char
的另一个名称。可以看到完整的程序。这就是我填写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;
}
}
void
floatfilljsarr(JSSample*jsr,float*arr,size\u t size,字符颜色)
{
尺寸i;
双m;
浮动最小值,最大值;
/*查找数组的最小值和最大值:*/
fminmax(arr、尺寸、最小值和最大值);
m=(双)UCHAR_MAX/(双)MAX-(双)min);
如果(颜色=='g')
{
对于(i=0;i尝试反转K通道:
jsr[i*4+3]= (m - ((arr[i]-min)*m);
我想我自己找到了答案。首先,我尝试将所有四种颜色设置为相同的值。这确实产生了一个合理的结果,但输出没有像我预期的那样反转。因此,所有四种颜色中最大值的像素是白色,而不是黑色
就在那时,我突然想到,在这个过程中的某个地方,无论是在IJG的libjpeg
中,还是在JPEG标准中,我都不知道哪种颜色是反转的。例如,青色值0实际上在显示器或打印设备上解释为UCHAR_MAX
,反之亦然。如果这是解决方案是,问题中的图像非常暗,其灰度与灰度图像相同,这一事实很容易解释(因为我将所有其他三种颜色设置为零,这实际上被解释为最大强度!)
因此,我将前三种CMYK颜色设置为全范围(UCHAR\u MAX
):
令我惊讶的是,这张图片居然成功了。灰阶(左)的灰度更暗,但至少一般来说一切都可以解释,并且相当相似。我单独检查了一下,绝对黑色在两者中是相同的,但对于相同的像素值,灰阶中的灰度更暗
在我检查了打印出来的照片(如下)后,结果似乎差别不大,尽管灰色的阴影更暗!这张照片是用我的智能手机拍摄的
另外,在我做出这一改变之前,在一个普通的图像查看器上(我使用的是Scientific Linux),图像将是完全黑色的,这就是为什么我认为我看不到CMYK图像!但是经过这一修正后,我可以像普通图像一样看到CMYK图像,两者几乎相同。谢谢,我通过从UCHAR\u MAX
中减去每个值来反转图像,因为(arr[I]-min)*m
介于0
到UCHAR\u MAX
之间。我更新了问题。它仍然没有灰度那么清晰。确保“白色”对于CYMK,表示为0,“黑色”是UCHAR_MAX。我认为您的原始灰度(实际上是RGB,其中R=G=B)公式略有不同,并且精确地映射了{min,MAX}到范围0..UCHAR_MAX.谢谢,但是我如何确定CMYK是如何定义黑白的呢?CMYK white:C=0,M=0,Y=0,K=0;CMYK black:C/M/Y(实际上没有定义,但是0保存了墨水),K={MAX}。因为您使用的是灰度,所以基本上可以认为K通道是(RGB)的反面灰度。根据您对数据的使用情况,不要排除使用CMY通道来增加图像对比度的乐趣。我用一个新数组作为输入更新了这个问题。似乎C=0、M=0、Y=0和K=0不对应白色!虽然我同意理论上应该如此!所以我想我做错了什么,但我不知道是什么!?!
jsr[i*4]=jsr[i*4+1]=jsr[i*4+2]=UCHAR_MAX /* Was 0 before! */;