2010-09-09 54 views
3

如果可能,使用libjpeg我想从JPEG图像的中间读取一行而不读取所有前面的行。这可以做到吗?我可以使用libjpeg读取特定的图像行吗?

+0

如果你的意思是直接从文件中,没办法。 JPEG格式被严格压缩,所以你不能在不需要解压缩整个文件的情况下拉出一行。 – 2010-09-09 21:41:27

+0

我担心可能会出现这种情况,尽管我曾希望JPEG压缩可能偶尔会重置,从而允许无序的读取。看看libpng,它似乎也只允许顺序访问。那么,我假设PNG也不能被随机读取? – 2010-09-09 22:45:21

+0

PNG可能更适合随机访问,但前提是其无损压缩模式未使用。大多数图像处理库都将文件I/O作为一种填充和存储帧缓冲区的方式,并且所有实际处理都是在包含整个图像的未压缩缓冲区的RAM中完成的。魔鬼详细介绍了如何组织缓冲区。 – RBerteig 2010-09-10 01:02:13

回答

2

答案几乎肯定是“你可以,但需要比你想要的更多的努力”。

JPEG图像是一种标记流,它包含整个压缩图像的全局信息或与图像特定部分相关的信息。压缩通过将图像分解成色彩平面来工作,可能将色彩空间改变为可对色彩信息进行降采样的色彩空间,并在每个以8x8像素块为单位的平面内进行。

例如,如果通过仅转置基本块和每个块内部的系数来确定压缩图像的大小使其仅由整个块构成,则可以将压缩图像旋转90度;即不需要解压缩,旋转真实图像并重新压缩。

鉴于此,您的方法是在进入库的过程中解析标记流,将所有标记全局传递给图像,修改与图像大小相关的任何标记,并删除包含系数的标记裁剪矩形。

如果限制种植完成基本块太粗糙,您可能需要进一步裁剪结果。

我不清楚的是,是否有真正的胜利替代方案,即从图书馆出来的结果。该库具有高度可配置性,因此您可以提供未压缩的数据使用者功能,该功能会丢弃裁剪矩形之外的所有像素,并只保存想要保留的像素。

+0

感谢您的详细评论。我认为你是对的,与简单地处理libjpeg的输出相比,它没有什么优势。我最初的想法是将图像保存在磁盘上,然后加载和绘制特定的图块。最后,我认为更好的方法是简单地一次处理源文件一行,在磁盘上生成缓存切片,然后根据需要加载这些切片。 – 2010-09-11 02:35:34

+0

@Michael Cooper,这对我很有意义。您可以使用多分辨率金字塔,并按需填充切片,并将其缓存回磁盘。我相信这实质上就是Adobe Light Room在其缩略图缓存中所做的,例如,每个分辨率都放在一个单独的文件中。 – RBerteig 2010-09-11 03:21:16

相关问题