c - libjpeg:一次处理所有扫描线

标签 c jpeg libjpeg

我使用来自 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() 调用中只读取几行。对此有什么想法吗?

最佳答案

only a couple of lines are read in each 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);
}

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

关于c - libjpeg:一次处理所有扫描线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13773644/

相关文章:

java - 使用 Java 进行图像转码(JPEG 到 PNG)

xcode - 使用 .jpg 纹理文件的 OpenGL 纹理映射

c++ - 如何使用 DLIB 库加载 jpeg 文件?

从数组转换为指针。我错过了什么吗?

python - RPC 协议(protocol)比较

matlab - 循环帧提取matlab

c - 编写未压缩的 JPEG 或 PNG 图像的简单方法?

linux - 写出 libjpeg 图像时内存泄漏

c - 将字符串拆分为不同的变量

c - 理解深度优先遍历