1

我使用来自Independent JPEG Group的 jpeg 库 v8d ,我想改变 jpeg 解压缩读取和处理数据的方式。

在 djpeg中,每次调用main()中一次只读取和处理一个扫描线/行。jpeg_read_scanlines()因此,要读取整个图像,将调用此函数,直到读取并处理所有行:

  while (cinfo.output_scanline < cinfo.output_height) { 
    num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
                    dest_mgr->buffer_height); //read and process
    (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); //write to file
  }

但是我想读取整个图像一次并将其存储在内存中,然后从内存中处理整个图像。通过阅读libjpeg.txt,我发现这是可能的:“如果您将整个图像都保存在内存中,您可以一次调用处理整个图像,但通常一次处理一条扫描线是最简单的。”

尽管我取得了一些进展,但我无法让它完全发挥作用。pub.buffer_height我现在可以通过增加value 和size来读取几行pub.buffer,但无论多大pub.buffer_height,每次调用pub.buffer只读取几行。jpeg_read_scanlines()对此有什么想法吗?

4

1 回答 1

3

每一行只读取几行jpeg_read_scanlines()

是的,所以你循环调用它。这是一个一次抓取一条扫描线的循环:

unsigned char *rowp[1], *pixdata = ...;
unsigned rowbytes = ..., height = ...;

while (cinfo.output_scanline < height) {
    rowp[0] = pixdata + cinfo.output_scanline * rowbytes;
    jpeg_read_scanlines(&cinfo, rowp, 1);
}

循环退出后,您将拥有整个图像。

于 2012-12-08T17:13:29.427 回答