2009-11-10 12 views
7

私は現在Perl Magick http://www.imagemagick.org/script/perl-magick.php、Image Magick http://www.imagemagick.orgへのperlインターフェイス、&私たちのサイトのユーザーがアップロードする写真を変換するために使用しています。私はまた、これらの画像に添付EXIFデータの一部をキャプチャできるようにしたいのですが、私は、次のコマンドを使用して画像の魔術へのコマンドラインインターフェイスを使用してこれを行う方法を見つけ出すことができました:PerlMagickを使用してEXIFデータを抽出するにはどうすればよいですか?

/usr/bin/identify -format "%[EXIF:*]" image.jpg 
私はPerlの魔術から、これと同じ結果を得るために、約100の方法を試してみたが、私は上の使用している同じパラメータを渡す方法を見つけ出すことはできません

exif:ApertureValue=29/8 
exif:ColorSpace=1 
exif:CompressedBitsPerPixel=3/1 
exif:CustomRendered=0 
exif:DateTime=2002:10:08 19:49:52 
exif:DateTimeDigitized=2002:09:29 14:03:55 
exif:DateTimeOriginal=2002:09:29 14:03:55 
exif:DigitalZoomRatio=1/1 
exif:ExifImageLength=307 
exif:ExifImageWidth=410 
exif:ExifOffset=192 
exif:ExifVersion=48, 50, 50, 48 
exif:ExposureBiasValue=0/1 
exif:ExposureMode=0 
exif:ExposureTime=1/1000 
exif:Flash=24 
exif:FlashPixVersion=48, 49, 48, 48 
exif:FNumber=7/2 
exif:FocalLength=227/32 
exif:FocalPlaneResolutionUnit=2 
exif:FocalPlaneXResolution=235741/32 
exif:FocalPlaneYResolution=286622/39 
exif:Make=Canon 
exif:MaxApertureValue=12742/4289 
exif:MeteringMode=5 
exif:Model=Canon PowerShot S30 
exif:ResolutionUnit=2 
exif:SceneCaptureType=0 
exif:SensingMethod=2 
exif:ShutterSpeedValue=319/32 
exif:Software=Adobe Photoshop 7.0 
exif:WhiteBalance=0 
exif:XResolution=180/1 
exif:YResolution=180/1 

:特定の写真を以下のEXIF情報を返す

それを正しく動作させるためのコマンドライン。ここで働いているようだいずれも私が試したのバリエーションのカップルです:

私がPerlでの画像ファイルからEXIFデータを抽出するための他の方法があるが、知っている
use Image::Magick; 
my $image = Image::Magick->new; 
my $exif = $image->Identify('image.jpg'); 
print $exif; 

$image->Read('image.jpg'); 
$exif = $image->Get('format "%[EXIF:*]"'); 
print $exif; 

我々はすでにPerlの魔術モジュールを持っているので、私は追加のモジュールをロードしなければならないので、メモリを無駄にしたくありません。私は誰かがすでに自分のサイトでこの作業をしており、解決策を共有できることを望んでいます。あなたの助けを前もってありがとう!

答えて

9
> cat im.pl 
use Image::Magick; 
my $image = Image::Magick->new(); 
$image->Read('/home/rjp/2009-02-18/DSC00343.JPG'); 
my $a = $image->Get('format', '%[EXIF:*]'); # two arguments 
my @exif = split(/[\r\n]/, $a); 
print join("\n", @exif); 
> perl im.pl 
exif:ColorSpace=1 
exif:ComponentsConfiguration=... 
exif:Compression=6 
exif:CustomRendered=0 
exif:DateTime=2009:02:13 16:18:15 
exif:DateTimeDigitized=2009:02:13 16:18:15 
... 

これはうまくいくようです。

バージョン:6.3.7のImageMagick 06/04/09 http://www.imagemagick.org

+0

+1今、なぜ私はそれを考えなかったのですか? –

+0

@rjpありがとう!魅力のように動作します。そして、記録的な時間にも。 –

+1

これをどのように把握しましたか? APIは非常に鈍いです! – rjh

1

Phil HarveyのExifToolを使用することを強くお勧めします。それは包括的かつ十分に文書化されています。また、画像全体をメモリに読み込むことはなく、文書によれば、ファイルハンドルを開いた画像ファイルに渡すだけでExif情報を画像から取得できます。だから、たくさんの記憶を無駄にしてはいけません。

+0

@Kinopiko - 私はそのルートを行くことにした場合、あなたは私が私達のユーザーがPerlの魔術の代わりにアップロードした画像のサイズを変更するために使用するものを示唆していますか?私はすでにPerl Magickと元のアップロードされた写真を私たちのサイトで使用するためにいくつかの異なるサイズに変換するためにイメージを読み込まなければなりません。私は他の選択肢がありますが、1つまたは2つのモジュールがはるかに少ないメモリ使用量でトリックを行うことができるときに、5つのperlモジュールを読み込んでいないことを確認したいと思います。ありがとう! –

+0

ああ、申し訳ありませんが、私は誤解しました。私は、イメージの複数の読み込みではなく、モジュール自体が取ったメモリを意味すると思いました。 ExifToolは画像をスキャンするのがかなり速いので、画像全体をメモリに読み込むことはできません。 –

+0

文書をチェックしたところ、Exiftoolは開いているファイルハンドルでも機能します。私はそれを反映する答えを変えました。 –

0

編集Q16: @rjpは、個別のタグではなく、すべての情報にアクセスする方法を示しました。ここでハッシュにデータを置く方法である:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Image::Magick; 

my $image = Image::Magick->new; 
$image->read('test.jpg'); 

my %exif = map { s/\s+\z//; $_ } 
      map { split /=/, $_ } 
      split /exif:/, $image->Get('format', '%[EXIF:*]'); 

use Data::Dumper; 
print Dumper \%exif; 
+0

実際にはそうしていません。 'EXIF:*'を指定すると、すべてのタグを単一の文字列として要求できます。私にとっては、すべてのEXIFタグの返された文字列を、私が望む任意のタグを使用できるハッシュに簡単に変換できるので、これは望ましいことです。 –

+0

@Russel C.ええ、私は知っています。 @ rjpの投稿に対する私の投票とコメントに注目してください。 –

関連する問題