【问题标题】:Detect a PNG image's length from a stream从流中检测 PNG 图像的长度
【发布时间】:2015-01-29 00:59:57
【问题描述】:

基本上我的问题类似于this one,但来自PNG而不是JPEG。

更具体地说,我有一堆串联在一起的 PNG 图像,我想知道它们的长度,所以我可以将流分成与单个图像相对应的片段。

我不需要解码或验证图像。我可以假设输入流由有效的 PNG 图像组成,并且不想验证这一点。相反,对我来说,尽快执行此操作很有用,因此所需的解码操作越少越好。

【问题讨论】:

  • 方式比使用 JPEG 更容易,因为 PNG 文件具有有效的起始 sig 和文件结尾块。将块大小相加,直到遇到 IEND,然后就完成了。请参阅specifications

标签: png


【解决方案1】:

这里有一个 perl 脚本,基于 this answer

#!/usr/bin/perl
undef $/;
$_ = <>;
$n = 0;

for $match (split(/(?=\x{89}PNG\x{0d}\x{0a}\x{1a}\x{0a})/)) {
      open(O, sprintf('>temp%04d.png',++$n));
      print O $match;
      close(O);
}

将其保存为 splitpng.pl 并运行 perl splitpng.pl &lt; myfile

这不是 100% 万无一失(严格的方法是计算块大小,根据 Jongware 的评论),但在 PNG 中包含该签名的概率应该很小。

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多