如何使用Perl将图像读取为字节数组?

3

我对Perl的经验非常有限。

我需要读入一个二进制图像文件并将其传递给Image::ExifTool模块。

这是我的代码:

use Image::ExifTool;

my $exifTool = new Image::ExifTool; 

open(IMAGE, $file) || die "Can't Open $file\n";
binmode(IMAGE);

my ($buf, $data, $n);
while (($n = read FILE, $data, 4) != 0) {
  $buf .= $data;
}

#'.=' is concat
print $file .= " test";

$infob = $exifTool->ImageInfo(\$buf);

foreach ( keys %$infob ) {
    print "$_ => $$infob{$_}\n";
}

close(IMAGE);

据我所知,上述代码会读取参考文件,并以字节级别将二进制数据附加到$buf中。
根据ExifTool文档,您可以将内存引用作为标量变量传递给ImageInfo方法 -- 如上所示。
执行时,Image::ExifTool模块会输出以下内容:
Error => Unknown file type

顺便提一下:你误用了.=,并且你对它的注释是错误的。.是连接符。.=是连接并将结果分配给左侧的变量。你可能打算通过print语句的副作用来改变$file的值,但我怀疑这一点。 - Ven'Tatsu
1
дҪ зҡ„ read еә”иҜҘдҪҝз”Ё IMAGE ж–Ү件еҸҘжҹ„иҖҢдёҚжҳҜ FILE ж–Ү件еҸҘжҹ„гҖӮ - hexcoder
2个回答

5
use Image::ExifTool;

my $exifTool = new Image::ExifTool; 

open( my $IMAGE, $filename ) || die "Can't Open $filename\n";
binmode($IMAGE);

$infob = $exifTool->ImageInfo($IMAGE);

foreach ( keys %$infob ) {
    print "$_ => $$infob{$_}\n";
}

close($IMAGE);

open(my $FH, '<:gzip', 'svgfile.svgz'); $infob=ImageInfo($FH); 中无法处理 .svgz 文件(返回“错误” => “未知文件类型”)。有什么想法吗? - Onlyjob
它确实支持 .SVG,至少在事实上是这样。解析 .SVGZ 的解决方案是将未打包的内容读入变量,然后将其作为引用传递给 ImageInfo$infob=ImageInfo(\$svg_content); - Onlyjob

0

open 只接受文件句柄,不接受标量。 因此使用 IMAGE 而非 $IMAGE

如果您尝试进行读取操作,这将在以后造成麻烦。

$n = read IMAGE, $data, 4;

从文件中获取数据。 扩展之前的代码:

use Image::ExifTool;
my $exifTool = new Image::ExifTool;
$filename = $ARGV[0];
open( my $IMAGE, $filename ) || die "Can't Open $filename\n";
binmode($IMAGE);

$infob = $exifTool->ImageInfo($IMAGE);
foreach ( keys %$infob ) {
    print "$_ => $$infob{$_}\n";
}

$n = read $IMAGE, $data, 2;
printf ("read %d bytes: [%s]\n", $n, $data);

$ret = close($IMAGE);
print "close returned $ret\n";

给出这个:

GreenMask => 0x0000ff00
BMPVersion => Windows V4
NumColors => 2
PixelsPerMeterX => 3938
RedMask => 0x00ff0000
Planes => 1
FileType => BMP
<snip>

read 2 bytes: [^@^@]
close returned 1

请注意,读取操作未正常工作--应该返回位图文件的前两个字节的BM。原因是打开调用不接受标量,而是接受文件句柄。
use Image::ExifTool;

my $exifTool = new Image::ExifTool;

$filename = $ARGV[0];

open(  IMAGE, $filename ) || die "Can't Open $filename\n";
binmode(IMAGE);

$infob = $exifTool->ImageInfo($filename);

foreach ( keys %$infob ) {
    print "$_ => $$infob{$_}\n";
}

$n = read IMAGE, $data, 2;
printf ("read %d bytes: [%s]\n", $n, $data);

$ret = close(IMAGE);
print "close returned $ret\n";

这个是:

这提供了:

Megapixels => 0.994
Directory => .
ImageWidth => 850
ImageSize => 850x1169
BitDepth => 1
<snip> 
FilePermissions => rw-r--r--
Compression => None
NumColors => 2
FileName => staves.bmp
BlueMask => 0x000000ff
read 2 bytes: [BM]
close returned 1

读取操作正常,ExifTool 也正常工作。

(希望格式没问题。我是新手……)


你能详细说明一下吗?看起来你在评论其他(已接受的)答案?在回答中,你应该尽量给出与原始问题相对应的完整答案。谢谢。此外,请尝试使用代码格式化以提高可读性。 - Jan Dolejsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接