Как я могу извлечь данные EXIF, используя PerlMagick? - PullRequest
7 голосов
/ 10 ноября 2009

В настоящее время я использую Perl Magick http://www.imagemagick.org/script/perl-magick.php, интерфейс Perl для Image Magick http://www.imagemagick.org, для обработки и конвертации фотографий, загружаемых пользователями нашего сайта. Я хотел бы иметь возможность также захватывать некоторые данные EXIF, прикрепленные к этим изображениям, и я смог выяснить, как это сделать, используя интерфейс командной строки для Image Magick, с помощью следующей команды:

/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;

Я знаю, что есть другие способы извлечения данных EXIF ​​из файла изображения в perl, но, поскольку у нас уже есть загруженный модуль Perl Magick, я не хочу тратить больше памяти на загрузку дополнительного модуля. Я надеюсь, что кто-то уже работает над их сайтом и может поделиться решением. Заранее спасибо за помощь!

Ответы [ 3 ]

9 голосов
/ 10 ноября 2009
> 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
...

Кажется, это работает.

Версия: ImageMagick 6.3.7 06.04.09 Q16 http://www.imagemagick.org

1 голос
/ 10 ноября 2009

Я настоятельно рекомендую вам использовать ExifTool Фила Харви. Это всеобъемлющее и хорошо документированное. Кроме того, он не считывает все изображение в память, и в соответствии с документацией вы можете получить информацию Exif из изображения, просто передав ему дескриптор файла в файл открытого изображения. Так что это не должно тратить много памяти.

0 голосов
/ 10 ноября 2009

Редактировать: @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;
...