2009-11-10 12 views
7

J'utilise actuellement Perl Magick http://www.imagemagick.org/script/perl-magick.php, l'interface perl pour Image Magick http://www.imagemagick.org, pour traiter & convertir les photos que nos utilisateurs du site uploadent. Je voudrais être en mesure de saisir aussi quelques-unes des données EXIF ​​attachées à ces images et je suis en mesure de comprendre comment faire en utilisant l'interface de ligne de commande à l'image Magick avec la commande suivante:Comment puis-je extraire des données EXIF ​​à l'aide de PerlMagick?

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

qui renvoie les informations suivantes EXIF ​​pour une photo particulière:

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 

J'ai essayé sur 100 façons d'obtenir ce même résultat de Perl Magick mais ne peut pas comprendre comment passer les mêmes paramètres que je utilise sur la ligne de commande pour le faire fonctionner correctement. Voici quelques variations que j'ai essayé dont aucun ne semble avoir fonctionné:

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; 

Je sais qu'il ya d'autres façons d'extraire les données EXIF ​​à partir d'un fichier image en Perl, mais puisque nous avons déjà le module Magick Perl chargé Je ne veux plus perdre de mémoire en chargeant un module supplémentaire. J'espère que quelqu'un a déjà travaillé sur leur site et peut partager la solution. Merci d'avance pour votre aide!

Répondre

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

Cela semble fonctionner.

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

+0

+1 Maintenant, pourquoi n'y ai-je pas pensé? –

+0

@rjp Merci! Fonctionne comme un charme. Et en temps record aussi. –

+1

Comment avez-vous compris? L'API est si obtuse! – rjh

1

Je vous recommande fortement d'utiliser le ExifTool de Phil Harvey. C'est complet et bien documenté. En outre, il ne lit pas l'intégralité de l'image en mémoire et, selon la documentation, vous pouvez obtenir les informations Exif de l'image simplement en lui passant un descripteur de fichier dans un fichier image ouvert. Donc ça ne devrait pas gaspiller beaucoup de mémoire.

+0

@Kinopiko - Si je devais aller dans cette voie, que suggérez-vous-je utiliser pour redimensionner les images nos utilisateurs téléchargent au lieu de Perl Magick? Je dois déjà charger Perl Magick et l'image pour convertir la photo originale téléchargée en un certain nombre de tailles différentes pour une utilisation sur notre site. Je suis ouvert à d'autres alternatives mais je veux m'assurer que je ne charge pas 5 modules Perl et que je lis l'image plusieurs fois quand 1 ou 2 modules pourraient faire l'affaire avec beaucoup moins de mémoire. Merci! –

+0

Oh, désolé, j'ai mal compris. Je pensais que vous vouliez dire la mémoire prise par le module lui-même plutôt que le chargement multiple de l'image. ExifTool est assez rapide pour numériser des images, donc je doute qu'il lise toute l'image en mémoire. –

+0

J'ai vérifié la documentation et il semble qu'Exiftool puisse fonctionner même avec un descripteur de fichier ouvert. J'ai changé la réponse pour refléter cela. –

0

Edit: @rjp a montré comment accéder à toutes les informations plutôt que des étiquettes individuelles. Voici comment mettre les données dans un hachage:

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

En fait, vous ne le faites pas. Vous pouvez demander toutes les balises en une seule chaîne en spécifiant 'EXIF: *'. Pour moi, c'est préférable car je peux facilement convertir la chaîne retournée de toutes les balises EXIF ​​en un hachage à partir duquel je peux utiliser n'importe quelle balise que je souhaite. –

+0

@Russel C. Oui, je sais. Notez mon vote et commentez le post de @ rjp. –