2011-07-25 19 views
3

我有很少的Perl經驗。如何使用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方法 - 這是上面完成的。

執行時,圖像:: ExifTool模塊吐出來的是以下幾點:

Error => Unknown file type 
+0

邊注:您的誤用'='和你對此有何評論是錯誤的。 '.'是連接的。 '。='連接並將結果分配給左側的變量。你可能打算改變'$ file'的值作爲'print'語句的一個副作用,但是我懷疑它。 –

+1

你的'read'應該使用'IMAGE'文件句柄來代替'FILE'文件句柄。 – hexcoder

+0

Thx編輯! – Will

回答

4
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(my $ FH,'<:gzip','svgfile.svgz')中的.svgz文件(返回'Error'=>'未知文件類型')不起作用。 $ infob = ImageInfo($ FH);'有什麼想法? – Onlyjob

+0

它確實支持.SVG,至少它事實上支持它。解析.SVGZ的解決方案是將解壓後的內容放入變量中,然後將其作爲參考傳遞給'ImageInfo':'$ infob = ImageInfo(\ $ svg_content);' – Onlyjob

相關問題