【问题标题】:Read bunch of JPGs from container从容器中读取一堆 JPG
【发布时间】:2014-08-01 11:18:25
【问题描述】:

我有一个容器文件,其中包含一个标题(纯文本数据)和一堆 JPG,除以十分之几的零。

我目前有一些 Python 代码,它们执行以下操作:

  • 在需要时跳过零和标题;
  • 寻找 SOI (0xFF, 0xD8) 标记;
  • 寻求EOI(0xFF0xD9)标记;
  • 使用来自 Pillow 库的 feed 函数读取图像本身并保存以将其写入文件;
  • 重复直到保存所有图像。

我想用 C++ 重写它,但坚持阅读 JPG,我想要 feed 函数的完整模拟:可以从 fstreamFILE * 在开始和停止之间读取 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


【解决方案1】:

我自己会使用 Qt 库,特别是 QImageReader/QImageWritter。他们可以读取(和写入)QFile,这可以用于在读取图像之前搜索(并最终操作)文件。

Qt 也为构建 GUI 提供了巨大的支持。所以你可以很容易地显示例如图像预览给用户,同时允许他输入文件甚至路径名,或者通过文件浏览器小部件轻松选择它们。

如果您计划在 C++ 中进行更多高级工作,Qt 是我推荐的第一票目的图书馆。一旦你进行了 Qt 链接,就会有很多机会(这在非 Linux 发行版环境中可能有点棘手,但无论如何在几天之内都是可行的)。 Qt 学习基础一开始看起来很庞大,但文档很棒而且曲线可能非常陡峭。

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2020-06-21
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多