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

问题描述 投票:3回答:2

我对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文档,您可以将对文件的内存引用作为标量var传递给ImageInfo方法-上面已完成。

[执行时,Image :: ExifTool模块吐出以下内容:

Error => Unknown file type
perl image file byte
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);

0
投票

open使用file handle,而不是标量。因此,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也正常。

(希望格式化还可以。我是新手。...]

© www.soinside.com 2019 - 2024. All rights reserved.