将libjpeg与8位灰度源图像一起使用,可以完成吗?

时间:2018-09-12 00:39:29

标签: libjpeg

我正在使用libjpeg创建jpeg

http://www.ijg.org/

但是,只有将3分量rba图像传递给它,它才能起作用。如果我尝试传递1分量灰度图像,则它不起作用。具体来说,这可行:

bundle exec rake db:migrate

但是这不起作用:

#define COLOR_COMPONENTS    (3)
#define COLOR_SPACE         (JCS_RGB)
JSAMPLE image_buffer[WIDTH*HEIGHT *3] = 
{
0x80, 0x80, 0x80,    0x80, 0x80, 0x80,    0x80, 0x80, 0x80,    0x80, 0x80, 0x80,
0x80, 0x80, 0x80,    0x00, 0x00, 0x00,    0x00, 0x00, 0x00,    0x80, 0x80, 0x80,
0x80, 0x80, 0x80,    0x00, 0x00, 0x00,    0x00, 0x00, 0x00,    0x80, 0x80, 0x80,
0x80, 0x80, 0x80,    0x80, 0x80, 0x80,    0x80, 0x80, 0x80,    0x80, 0x80, 0x80,
};

...
// inside libjpeg I set the values
cinfo.image_width = image_width;    /* image width and height, in pixels */
cinfo.image_height = image_height;
cinfo.input_components = COLOR_COMPONENTS;      /* # of color components per pixel */
cinfo.in_color_space = COLOR_SPACE;     /* colorspace of input image */
/* Now use the library's routine to set default compression parameters.
* (You must set at least cinfo.in_color_space before calling this,
* since the defaults depend on the source color space.)
*/
jpeg_set_defaults(&cinfo);

我可以使用libjpeg编码8位图像吗?以下代码的正确设置是什么?

#define COLOR_COMPONENTS    (1)
#define COLOR_SPACE         (JCS_GRAYSCALE)
JSAMPLE image_buffer[WIDTH*HEIGHT * 1] =
{
    0x80, 0x80, 0x80, 0x80,
    0x80, 0x00, 0x00, 0x80,
    0x80, 0x00, 0x00, 0x80,
    0x80, 0x80, 0x80, 0x80,
};

该代码需要在低时钟CPU上运行。因此,我没有多余的时间可以从灰度图像转换为RGB。

谢谢!

1 个答案:

答案 0 :(得分:0)

没关系,我发现了问题所在。行跨度需要匹配色彩空间。

原始资料来源:

row_stride = image_width * 3;   /* JSAMPLEs per row in image_buffer */

我只是将row_stride更改为1,因为它是每像素1字节的灰度级

row_stride = image_width * 1;   /* JSAMPLEs per row in image_buffer */

在所有情况下都感谢您阅读