3

libjpeg 中的任何函数是否像 matlab 中的 imread 一样输出图像矩阵?

4

1 回答 1

4

从 libjpeg v9 发行说明(http://www.ijg.org/files/):

像素由扫描线存储,每条扫描线从左到右运行。每个像素的分量值在行中是相邻的;例如,R,G,B,R,G,B,R,G,B,... 用于 24 位 RGB 颜色。每个扫描线都是一个数据类型为 JSAMPLE 的数组——通常是“无符号字符”,除非您更改了 jmorecfg.h。(您还可以通过修改 jmorecfg.h 来更改 RGB 像素布局,例如 B、G、R 顺序。但在此之前请参阅该文件中列出的限制。)

通过制作指向扫描线起点的指针列表来形成二维像素阵列;所以扫描线不需要在内存中物理上相邻。即使一次只处理一条扫描线,也必须创建一个单元素指针数组以符合此结构。指向 JSAMPLE 行的指针是 JSAMPROW 类型,指向指针数组的指针是 JSAMPARRAY 类型。

图书馆在每次调用时接受或提供一条或多条完整的扫描线。一次处理行的一部分是不可能的。扫描线总是从上到下处理。如果您将所有图像都保存在内存中,则可以一次调用处理整个图像,但通常一次处理一条扫描线是最简单的。

关键部分是:

通过制作一个指针列表来形成一个二维像素数组

这意味着库本身不会返回像素的“矩阵”;相反,它返回行(扫描线),用户负责将这些扫描线排列成“矩阵”。这不是太具有挑战性,但需要做一些工作。以下代码片段显示了 JPEG 解压缩的工作示例:

while (decompressor.output_scanline < decompressor.output_height)
{
    pRow = &jpegInputBuffer[decompressor.output_scanline*rowStride];
    jpeg_read_scanlines(&decompressor, &pRow, 1);
}

请注意,我省略了许多细节(pRowrowStride的定义、解压器结构的加载方式等),因为这些似乎超出了问题的范围。

于 2013-04-25T18:50:07.267 回答