2011-07-25 21 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のドキュメントでは、ImageInfoメソッドのスカラー変数としてメモリ内の参照をファイルに渡すことができます。これは上記のとおりです。実行すると

、イメージ:: ExifToolモジュールは、次のことを吐き出す:

Error => Unknown file type 
+0

サイドノート:あなたの誤用 '='とそれに対するあなたのコメントが間違っています。 '.'は連結されています。 '。='は連結され、結果を左側の変数に代入します。 'print'文の副作用として' $ file'の値を変更しようと思ったかもしれませんが、私はそれを疑っています。 –

+1

'read'は' FILE'ファイルハンドルの代わりに 'IMAGE'ファイルハンドルを使うべきです。 – 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' => 'Unknown file type'を返します。 $ infob = ImageInfo($ FH); '何かアイデア? – Onlyjob

+0

.SVGをサポートしています。少なくとも、それは事実上サポートしています。 .SVGZを解析するソリューションは、解凍されたコンテンツを変数にスラップし、それを参照として 'ImageInfo'に渡すことです:' $ infob = ImageInfo(\ $ svg_content); ' – Onlyjob

関連する問題