Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中使用libjpeg在CMYK中保存灰度_C_Jpeg_Grayscale_Libjpeg_Cmyk - Fatal编程技术网

在c中使用libjpeg在CMYK中保存灰度

在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的另一个名称

如果这个函数和我想的一样,那么在我的机器上,至少在CMYK中,C=0,M=0,Y=0和K=0与白色不对应!有什么问题

float*arr
是一个带有
size
元素的浮点数组。我想根据需要在两个颜色空间中将此数组保存为带有“libjpeg”的JPEG格式:
g
:灰度和
c
:CMYK。我按照他们的示例,使用
jssample
元素的数量(取决于颜色空间)创建输入
jssample*jsr
数组:
size
元素用于灰度,而
4*size
元素用于CMYK
JSAMPLE
至少在我的机器上是
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! */;