【问题标题】:libjpeg: process all scanlines oncelibjpeg:一次处理所有扫描线
【发布时间】: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_heightpub.buffer 有多大,每个jpeg_read_scanlines() 调用中只读取几行。对此有什么想法吗?

【问题讨论】:

  • 这也是我的经验。一直循环直到你得到整个图像,然后你可以在循环完成后立即处理整个图像。
  • @DietrichEpp,这不起作用,因为缓冲区在每次循环迭代中都会被覆盖。
  • 它确实有效,我已经做到了。在每次迭代中,您将指针传递给缓冲区中的第一个未读扫描行。在循环结束时,每条扫描线都已读取完毕,缓冲区已满。
  • 你会放你的伪代码吗?我有点困惑,因为 jpeg_read_scanlines 确实读取并处理数据。所以我不知道在哪里可以在读取数据和处理数据之间划清界限。

标签: c jpeg libjpeg


【解决方案1】:

每个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);
}

一旦循环退出,你就有了整个图像。

【讨论】:

  • 这是有道理的,但我认为jpeg_read_scanlines() 既读取图像又处理图像。我弄错了吗?我认为所有计算密集型函数(如 DCT)都在 jpeg_read_scanlines 中调用。这样对吗?我想解耦 IO 操作,例如读取输入图像文件和计算密集型函数,例如 DCT。
  • @aminfar:上面的代码是从我的一个项目中复制而来的使用上述代码解码 JPEG,然后 (3) 它处理生成的光栅图像。上面的代码是第(2)步,如果LibJPEG设置正确,它根本不执行任何IO。步骤 (1) 和 (3) 不涉及 LibJPEG,我希望您已经知道如何读取文件以及解码后要如何处理它。
  • 感谢您的帮助。我认为我对 libJPEG 的理解与您的不同。据我所知,您发布的代码同时执行 (1) 和 (2)。在while 循环之前,仅读取图像头文件,并由jpeg_read_scanlines() 内部调用的辅助函数之一逐行读取图像本身。无论如何,也许我没有正确设置 libJPEG 或者我不理解它。
  • @aminfar:这很难提供帮助,因为您实际上是在问两个完全不同的问题。 问题 1: 如何从 LibJPEG 一次读取整个图像? 答案 1: 使用我发布的循环。 问题 2: 如何在解码图像之前完成 IO? 答案 2: 在您接触 LibJPEG 之前完成所有的 IO。如果你告诉它做 IO,LibJPEG 只会做 IO。这一切都在文档中的“压缩数据处理”部分中进行了非常详尽的解释。
  • 我使用了this post 的信息和你的答案,我终于能够得到我想要的。谢谢你的帮助。我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多