从PNG获取图像宽度和高度而不使用库

时间:2013-12-11 20:08:22

标签: regex image perl png

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

使用正则表达式/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));  
}

2 个答案:

答案 0 :(得分:3)

我只是查看了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;

答案 1 :(得分:1)

这是7年后的答案...

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