c++ - 对 libjpeg : jpeg_read_scanlines 感到困惑

标签 c++ jpeg rgb libjpeg

我对 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;
}


问题:我对输出缓冲区大小感到困惑。共example code我看到哪个使用了jpeg_read_scanlines,输出缓冲区的大小是width X height,其中width和height指的是JPEG文件的尺寸。因此,对于 10x10 JPEG 文件,我们有一个 100 字节的输出缓冲区。

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

为什么不呢?

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

最佳答案

你一次只读一行

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];

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

关于c++ - 对 libjpeg : jpeg_read_scanlines 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15103457/

相关文章:

php - 如何在 "save as"对话框中强制使用正确的文件扩展名? (.jpg 而不是 .php)

java - 如何获取CIELAB图像a轴和b轴上的像素值

c++ - FFMPEG:在 h264rgb/libx264rgb 错误中解码视频

c++ - "primary-expression before ' 。 g++ 中的 ' token error"

用于获取 JPEG 图像大小的 C++ 库

java - 图像未显示在 jPanel 中

ios - UIColor 的默认颜色空间是什么?

c++ - 如何在 C++ 中检索与线程相关的对象实例?

c++ - 试图用 C++11 替换旧的随机 API

c++ - 为什么 constexpr 成员不能用于 static_assert?