【发布时间】:2012-12-08 01:48:36
【问题描述】:
我使用来自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 值和pub.buffer 大小来读取几行,但无论pub.buffer_height 和pub.buffer 有多大,每个jpeg_read_scanlines() 调用中只读取几行。对此有什么想法吗?
【问题讨论】:
-
这也是我的经验。一直循环直到你得到整个图像,然后你可以在循环完成后立即处理整个图像。
-
@DietrichEpp,这不起作用,因为缓冲区在每次循环迭代中都会被覆盖。
-
它确实有效,我已经做到了。在每次迭代中,您将指针传递给缓冲区中的第一个未读扫描行。在循环结束时,每条扫描线都已读取完毕,缓冲区已满。
-
你会放你的伪代码吗?我有点困惑,因为 jpeg_read_scanlines 确实读取并处理数据。所以我不知道在哪里可以在读取数据和处理数据之间划清界限。