3

我对 libjpeg 的jpeg_read_scanlines工作方式感到困惑。据我了解,它逐行解压缩 JPEG,并创建解压缩的像素缓冲区。

典型用法如下:

jpeg_decompress_struct cinfo;

...

unsigned char* image = new unsigned char[cinfo.image_width  * cinfo.image_height];
unsigned char* ptr = image; 
int row_stride = cinfo.image_width;

while (cinfo.output_scanline < cinfo.image_height) 
{
    jpeg_read_scanlines(&cinfo, &ptr, 1);
    ptr += row_stride;
}


问题:我对输出缓冲区大小感到困惑。在我看到的所有示例代码jpeg_read_scanlines中,输出缓冲区的大小是width X height,其中宽度和高度指的是 JPEG 文件的尺寸。因此,对于 10x10 JPEG 文件,我们将有一个 100 字节的输出缓冲区。

但是……每个 RGB 像素的大小不是3 个字节(24 位)吗?那么未压缩的数据实际上不应该是width X height X 3字节吗?

为什么不是?

我注意到对于使用的代码,jpeg_write_scanlines要压缩的缓冲区 width X height X 3。那么为什么只使用缓冲区jpeg_read_scanlineswidth X height

4

2 回答 2

3

您一次只能阅读 1 行

jpeg_read_scanlines(&cinfo, &ptr, 1);

所以你只需要这条线

unsigned char* image = new unsigned char[cinfo.image_width * cinfo.image_height];

成为

unsigned char* image = new unsigned char[cinfo.image_width * cinfo.image_components];

缓冲区的开始被重新用于每个扫描线。您当前的大部分缓冲区实际上都未使用。

于 2013-08-08T21:50:55.270 回答
0

对于 RGB 数据,output_components将为 3 (R,G,B)。

以下是libjpeg.txt的一些相关文档:

   output_width     image width and height, as scaled
   output_height
   out_color_components # of color components in out_color_space
   output_components    # of color components returned per pixel
   colormap     the selected colormap, if any
   actual_number_of_colors      number of entries in colormap

output_components is 1 (a colormap index) when quantizing colors; otherwise it
equals out_color_components.  It is the number of JSAMPLE values that will be
emitted per pixel in the output arrays.

Typically you will need to allocate data buffers to hold the incoming image.
You will need output_width * output_components JSAMPLEs per scanline in your
output buffer, and a total of output_height scanlines will be returned.
于 2015-05-07T05:22:00.530 回答