如何使用Perl以字节数组的形式读取图像?

时间:2011-07-25 13:23:02

标签: perl image file byte

我的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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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。原因是open调用不使用标量,而是使用文件句柄:

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也正常。

(希望格式化没问题。我是新来的...。)