2009-11-10 82 views
7

我目前使用Perl Magick http://www.imagemagick.org/script/perl-magick.php,圖像Magick http://www.imagemagick.org的perl接口,來處理&轉換我們網站用戶上傳的照片。我希望能夠捕捉也有些附着在這些圖片的EXIF數據中,我已經能夠找出如何使用命令行界面難懂的做到這一點使用下面的命令:如何使用PerlMagick提取EXIF數據?

/usr/bin/identify -format "%[EXIF:*]" image.jpg 

它返回以下EXIF信息對於特定的照片:

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 

我試着約100種,從Perl的Magick獲得此相同的結果,但無法弄清楚如何通過我使用的是相同的參數命令行使其正常工作。這裏有幾個我已經試過變化的其中沒有一個似乎已經奏效:

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中的圖像文件的EXIF數據,但由於我們已經擁有了Perl的Magick模塊我不想通過加載額外的模塊來浪費更多的內存。我希望有人在他們的網站上有這個工作,並可以分享解決方案。在此先感謝您的幫助!

回答

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的Q16 06/04/09 http://www.imagemagick.org

+0

+1現在,我爲什麼沒有想到這一點。 – 2009-11-10 15:05:46

+0

@rjp謝謝!奇蹟般有效。並且創紀錄的時間。 – 2009-11-10 15:08:01

+1

你是怎麼解決這個問題的?該API太鈍了! – rjh 2013-02-10 22:20:22

1

我強烈建議你使用Phil Harvey的ExifTool。這是全面的和有據可查的。此外,它不會將整個圖像讀入內存,根據文檔,只需將文件句柄傳遞給打開的圖像文件即可從圖像中獲取Exif信息。所以它不應該浪費大量的內存。

+0

@Kinopiko - 如果我是走這條路,你會建議我用它來調整我們的用戶上傳的Perl Magick,而不是圖像?我已經必須加載Perl Magick和圖像,以將原始上傳的照片轉換爲多種不同的尺寸以供我們的網站使用。我打開其他選擇,但想確保我不會加載5個Perl模塊,並在1或2個模塊可以用更少的內存使用來實現這個技巧時多次讀取圖像。謝謝! – 2009-11-10 14:57:34

+0

哦,對不起,我誤解了。我以爲你的意思是模塊本身所採用的內存,而不是多次加載圖像。 ExifTool在掃描圖像上非常快速,所以我懷疑它會將整個圖像讀入內存。 – 2009-11-10 15:01:49

+0

我檢查了文檔,看起來Exiftool甚至可以在打開的文件句柄下工作。我改變了答案來反映這一點。 – 2009-11-10 15:04:50

0

編輯: @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標籤的返回字符串轉換爲散列,我可以使用任何標籤。 – 2009-11-10 15:30:56

+0

@Russel C.是的,我知道。請注意我的投票並對@ rjp的帖子發表評論。 – 2009-11-10 16:07:47