libjpeg 中的任何函数是否像 matlab 中的 imread 一样输出图像矩阵?
1 回答
从 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);
}
请注意,我省略了许多细节(pRow、rowStride的定义、解压器结构的加载方式等),因为这些似乎超出了问题的范围。