2009-11-10 7 views
7

मैं वर्तमान में पर्ल Magick http://www.imagemagick.org/script/perl-magick.php, छवि Magick http://www.imagemagick.org को पर्ल इंटरफ़ेस का उपयोग कर रहा हूँ, & तस्वीरें कि हमारी साइट उपयोगकर्ताओं को अपलोड कन्वर्ट कार्रवाई करने के लिए। मैं भी EXIF ​​इन छवियों से जुड़ी कुछ डेटा को पकड़ने में सक्षम होना चाहते हैं और मैं निम्न आदेश के साथ कैसे छवि Magick के लिए कमांड लाइन इंटरफेस का उपयोग कर ऐसा करने के लिए यह पता लगाने में सफल रहे हैं:मैं 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 तरीके पर्ल 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 ​​डेटा निकालने के लिए कर रहे हैं लेकिन जब से हम पहले से ही पर्ल 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 
... 

ऐसा लगता है कि यह काम करता है।

संस्करण: ImageMagick 6.3.7 06/04/09 प्रश्न 16 http://www.imagemagick.org

+0

+1 अब, मैं इसके बारे में क्यों नहीं सोचा था। –

+0

@rjp धन्यवाद! एक जादू की तरह काम करता है। और रिकॉर्ड समय में भी। –

+1

आपने इसे कैसे समझ लिया? एपीआई इतना उलझन में है! – rjh

1

मैं दृढ़ता से आप फिल हार्वे की ExifTool उपयोग करने के लिए सलाह देते हैं। यह व्यापक और अच्छी तरह से प्रलेखित है। इसके अलावा, यह स्मृति में पूरी छवि को पढ़ने नहीं है, और प्रलेखन के अनुसार तुम सिर्फ यह एक खुला छवि फ़ाइल के लिए एक फ़ाइल हैंडल पास करके छवि से Exif जानकारी प्राप्त कर सकते हैं। तो यह बहुत मेमोरी बर्बाद नहीं करना चाहिए।

+0

@Kinopiko - अगर मैं उस मार्ग से जाने के लिए था, तुम क्या सुझाव है कि मैं हमारे उपयोगकर्ताओं पर्ल Magick के बजाय अपलोड छवियों का आकार करने के लिए प्रयोग करते हैं? मुझे पहले से अपलोड की गई तस्वीर को हमारी साइट पर उपयोग के लिए कई अलग-अलग आकारों में बदलने के लिए पर्ल मैजिक और छवि को लोड करना होगा। मैं अन्य विकल्पों के लिए खुला रहा हूँ, लेकिन यकीन है कि मैं 5 पर्ल मॉड्यूल लोड हो रहा है नहीं कर रहा हूँ और छवि पढ़ने कई बार जब 1 या 2 मॉड्यूल अब तक कम स्मृति के उपयोग के साथ चाल कर सकता है बनाना चाहते हैं। धन्यवाद! –

+0

ओह, क्षमा करें, मुझे गलत समझा गया। मैंने सोचा था कि आप छवि के एकाधिक लोडिंग के बजाय मॉड्यूल द्वारा ली गई स्मृति का मतलब है। ExifTool छवियों को स्कैन करने में बहुत तेज़ है इसलिए मुझे संदेह है कि यह पूरी छवि को स्मृति में पढ़ता है। –

+0

मैं प्रलेखन की जाँच की और यह की तरह Exiftool एक खुला filehandle के साथ भी काम कर सकते हैं लग रहा है। मैंने इसे प्रतिबिंबित करने के लिए उत्तर बदल दिया है। –

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 ​​टैग की लौटाई स्ट्रिंग को हैश में परिवर्तित कर देता हूं जिससे मैं अपनी इच्छित टैग का उपयोग कर सकता हूं। –

+0

@ रूस सी। हाँ, मुझे पता है। @ Rjp की पोस्ट पर मेरा वोट दें और टिप्पणी करें। –

संबंधित मुद्दे