【问题标题】:Getting image width and height from PNG without library从没有库的PNG获取图像宽度和高度
【发布时间】:2020-08-19 09:26:29
【问题描述】:

根据 PNG(便携式网络图形)文件的规范,一个非常 first chunk 必须是 IHDR(4 字节),包含图像的宽度、高度和位深度。所以在IHDR 后面是代表width 的4 个字节,然后是代表图像的height 的接下来的4 个字节。

使用正则表达式/IHDR(.{4})(.{4})/s 并将$1$2 转换为widthheight 是否安全?如果是这样,我该如何进行这种转换?我应该使用unpack("N", $x) 还是unpack("V", $x) ..?


我当前的代码(不确定它是否适用于大图像):

if ($png =~ m/^\x89PNG\x0D\x0A\x1A\x0A....IHDR(.{4})(.{4})/s) {
  ($width, $height) = (unpack("N", $1) , unpack("N", $2));  
}

【问题讨论】:

    标签: regex image perl png


    【解决方案1】:

    我只是查看了 png 规范; IHDR 前面还有更多内容。所以这应该有效:

    open(IN, "<xx.png");
    binmode(IN);
    read(IN, $header, 24);
    if (substr($header, 12, 4) ne "IHDR") {
        die "this is not a PNG file";
    }
    ($width, $height)=unpack("NN", substr($header, 16));
    print "width: $width height: $height\n";
    close IN;
    

    【讨论】:

    • 在处理二进制数据时,例如在这种情况下,我通常更喜欢 substr() 而不是正则表达式,因为我不必关心像 '\n' 这样建议行尾的特殊字符正则表达式。
    • 是的,有 8 字节的 PNG 头和 4 字节表示 IHDR 块的大小,然后是 IHDR(4 字节/字符),宽度(4 字节),高度(4 字节),.. .
    【解决方案2】:

    这是7年后的答案……

    如果您在二进制级别处理 png,则宽度由 17-20 字节(含)指定(17、18、19、20),高度由 21-24 字节(含)指定(21、 22、23、24)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2015-09-04
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多