我对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
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使用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也正常。
(希望格式化还可以。我是新手。...]