我的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
答案 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也正常。
(希望格式化没问题。我是新来的...。)