2009-11-10 27 views
7

Obecnie używam Perl Magick http://www.imagemagick.org/script/perl-magick.php, interfejsu Perla do Image Magick http://www.imagemagick.org, do przetwarzania & konwersji zdjęć, które nasi użytkownicy serwisu ładują. Chciałbym być w stanie uchwycić również niektóre dane EXIF ​​dołączonych do tych obrazów i udało mi się dowiedzieć, jak to zrobić za pomocą interfejsu linii poleceń do ImageMagick za pomocą następującego polecenia:Jak mogę wyodrębnić dane EXIF ​​za pomocą PerlMagick?

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

która zwraca następujące informacje EXIF ​​o danym zdjęciu:

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 

próbowałem około 100 sposobów, aby uzyskać ten sam wynik z Perl magii, ale nie można dowiedzieć się, w jaki sposób przekazać te same parametry używam na wiersz poleceń, aby działał poprawnie. Oto kilka wariacji próbowałem z których żadna nie wydaje się, że pracował:

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; 

Wiem, że są inne sposoby, aby wyodrębnić dane EXIF ​​z pliku obrazu w Perl, ale skoro już mamy moduł Perl Magick załadowany Nie chcę marnować więcej pamięci przez ładowanie dodatkowego modułu. Mam nadzieję, że ktoś tam już działa na swojej stronie i może udostępnić to rozwiązanie. Z góry dziękuje za twoją pomoc!

Odpowiedz

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 
... 

To wydaje się działać.

Wersja: ImageMagick 6.3.7 06/04/09 Q16 http://www.imagemagick.org

+0

+1 Teraz, dlaczego nie pomyślałem o tym. –

+0

@rjp Dzięki! Działa jak marzenie. A także w rekordowym czasie. –

+1

Jak to rozgryzłeś? Interfejs API jest taki tępy! – rjh

1

Zdecydowanie polecam użyć Phila Harvey'a ExifTool. Jest obszerny i dobrze udokumentowany. Ponadto nie odczytuje całego obrazu w pamięci, a zgodnie z dokumentacją można uzyskać informacje Exif z obrazu, przekazując mu uchwyt pliku do pliku otwartego obrazu. Więc nie powinno to marnować dużej ilości pamięci.

+0

@Kinopiko - Gdybym miał iść tą drogą, co proponujesz używać do zmiany rozmiaru obrazów przesyłanych nasi użytkownicy zamiast Perl Magick? Już muszę załadować Perl Magick i obraz, aby przekonwertować oryginalne przesłane zdjęcie na kilka różnych rozmiarów do wykorzystania w naszej witrynie. Jestem otwarty na inne alternatywy, ale chcę się upewnić, że nie ładuję 5 modułów perla i wielokrotnie czytam obraz, gdy 1 lub 2 moduły mogą poradzić sobie z dużo mniejszą ilością pamięci. Dzięki! –

+0

Przepraszam, źle zrozumiałem. Pomyślałem, że chodziło ci o pamięć zajmowaną przez sam moduł, a nie wielokrotne ładowanie obrazu. ExifTool dość szybko skanuje obrazy, więc wątpię, żeby odczytał cały obraz w pamięci. –

+0

Sprawdziłem dokumentację i wygląda na to, że Exiftool może działać nawet z otwartym uchwytem pliku. Zmieniłem odpowiedź, aby to odzwierciedlić. –

0

Edit: @rjp pokazał jak uzyskać dostęp do wszystkich informacji, a nie poszczególnych znaczników. Oto jak umieścić dane w hash:

#!/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

Właściwie nie. Możesz zażądać wszystkich tagów jako pojedynczego łańcucha, podając "EXIF: *". Dla mnie jest to lepsze, ponieważ łatwo można przekonwertować zwrócony ciąg wszystkich tagów EXIF ​​do skrótu, z którego mogę użyć dowolnego znacznika, którego pragnę. –

+0

@Russel C. Tak, wiem. Zwróć uwagę na mój głos i komentarz do posta @ rjp. –

Powiązane problemy