【发布时间】:2014-08-01 11:18:25
【问题描述】:
我有一个容器文件,其中包含一个标题(纯文本数据)和一堆 JPG,除以十分之几的零。
我目前有一些 Python 代码,它们执行以下操作:
- 在需要时跳过零和标题;
- 寻找 SOI (
0xFF,0xD8) 标记; - 寻求EOI(
0xFF,0xD9)标记; - 使用来自 Pillow 库的
feed函数读取图像本身并保存以将其写入文件; - 重复直到保存所有图像。
我想用 C++ 重写它,但坚持阅读 JPG,我想要 feed 函数的完整模拟:可以从 fstream 或 FILE * 在开始和停止之间读取 JPG 的 C++ 库。
boost::GIL 有这样的东西吗?或任何其他建议。
【问题讨论】:
-
您真的需要解析和解码 JPEG 图像,还是只提取和保存未解码的文件就足够了?
-
@IlmariKaronen 解析和解码,因此保证是正确的 JPG(可以跳过格式错误的)。我保存未解码的文件没有问题。
-
嗯...如果 GIL 做不到,libjpeg 肯定可以。然而,它是一个相当低级的 C 库,所以它可能容易也可能不容易(取决于你对这些东西的熟悉程度)。
-
附言。虽然寻找 SOI 标记是找到可能的起点的好方法(特别是如果您也检查以下
JFIF/Exif块),只是盲目地寻找 EOI 标记不是 i> 一种可靠的方式来判断图像在哪里结束。尤其是,除了标记偶然出现在图像数据中的可能性之外,JPEG图像也很有可能嵌套有另一个 JPEG图像(例如缩略图)。判断图像结束位置的唯一可靠方法是增量解析数据流,直到找到结束(或错误)。 -
@IlmariKaronen 这就是为什么我也想解析它,使用当前版本(写入未解码的数据)我有时会得到格式错误的 JPG(感谢您指出为什么会这样,我不是很熟悉JPG 格式)。
标签: python c++ jpeg file-header