libjpeg中的任何函数是否都像matlab中的imread一样输出图像矩阵?
答案 0 :(得分:3)
从libjpeg v9发行说明(http://www.ijg.org/files/):
像素由扫描线存储,每条扫描线从左到右运行 对。每个像素的分量值在行中相邻;对于 例如,R,G,B,R,G,B,R,G,B,......用于24位RGB颜色。每条扫描线都是 数据类型JSAMPLE ---它通常是“unsigned char”,除非 你改变了jmorecfg.h。 (也可以改变RGB像素布局 到B,G,R顺序,通过修改jmorecfg.h。但请参阅中列出的限制 这样做之前。)
通过制作指向列表的指针来形成2-D像素阵列 扫描线的开始;因此扫描线不需要在物理上相邻 在记忆中。即使您一次只处理一条扫描线,也必须如此 创建一个单元素指针数组以符合此结构。 指向JSAMPLE行的指针是JSAMPROW类型,指针指向 指针数组的类型为JSAMPARRAY。
该库接受或提供一个或多个完整的扫描线 呼叫。不可能一次处理一部分行。 扫描线始终从上到下进行处理。你可以处理一个 如果你把它全部留在记忆中,那么整个图像就会在一次通话中出现 最简单的方法是一次处理一条扫描线。
关键部分是:
通过制作指针列表
形成2-D像素阵列
这意味着库本身不会返回像素的“矩阵”;相反,它返回行(扫描线),用户负责将这些扫描线排列成“矩阵”。这不是太具有挑战性,但需要做一些工作。以下代码段显示了JPEG解压缩的工作示例:
while (decompressor.output_scanline < decompressor.output_height)
{
pRow = &jpegInputBuffer[decompressor.output_scanline*rowStride];
jpeg_read_scanlines(&decompressor, &pRow, 1);
}
请注意,我省略了许多细节( pRow 的定义, rowStride ,如何加载解压缩程序结构等)因为那些似乎超出了问题的范围。