Чтение из двух файлов (один raw, один XMP) с ExifTool
Я новичок в PERL и даже новее в ExifTool - и поэтому, вероятно, упускаю что-то довольно простое.
Цель состоит в том, чтобы прочитать поля XMP из файла фотографии. Просматривая документацию exiftool как на сайте ExifTool, так и на CPAN, я смог без проблем прочитать файлы с тегами jpeg и XMP sidecar.
Проблема в том, что когда я читаю из необработанного файла, который, очевидно, не имеет пользовательских полей, я получаю сообщение об ошибке с неинициализированным значением. Этого следовало ожидать.
Итак, я хочу иметь код, который говорит: "Если вы читаете поле / тег из необработанного файла, а его там нет, посмотрите на связанный файл XMP и, если это не получится, верните пустую строку".
Поэтому я попытался открыть второй экземпляр ExifTool, например:
my $exifInfo = ImageInfo($filePath);
идет к
my $exifInfoXMP = ImageInfo($filePathXMP);
Но это продолжает терпеть неудачу. Если я читаю XMP непосредственно с самого начала, он работает просто отлично, поэтому у меня складывается впечатление, что я не могу читать две структуры ExifTool одновременно (что не может быть правильным; я должен быть здесь ошибкой), Приведенный ниже код работает, но я не могу "чередовать" условия для двух файлов. Сначала мне нужно обработать raw, затем выполнить второй проход с новым обработчиком для XMP. Зная, насколько эффективен PERL, мой подход не может быть хорошим (даже если он выполняет свою работу).
В частности, есть одна линия, которая озадачивает меня. Если я удаляю его, ничего не работает. (это должно быть хорошо отмечено).
$filePath =~ s/$photoExtensions$/.XMP/i;
Эта строка необходима для чтения XMP с самого начала (не мое идеальное решение).
У кого-нибудь есть идея, где я все испорчу?
Спасибо,
Павел
Заголовок ПОКАЗАЛ ВСЕ, ИСПОЛЬЗУЕТСЯ ВОПРОС]
#!/usr/bin/perl
# load standard packages
use strict;
use warnings;
use Data::Dumper;
use File::Find;
no warnings 'File::Find';
use Image::ExifTool ':Public';
# define proxy for ExifTool
my $exifTool = new Image::ExifTool;
my $exifToolXMP = new Image::ExifTool;
# turn on immediate updates
$|=1;
# common extensions that I want to recognize
my $photoExtensions = "\.(jpg|crw|cr2|cr3|rw2|orf|raw|nef|arw|dng)";
my $imageExtensions = "\.(tiff|tif|psd|png|eps|hdr|exr|svg|gif|afphoto|pdf)";
my $videoExtensions = "\.(flv|vob|ogv|avi|mts|m2ts|mov|qt|wmv|mp4|m4p|m4v|svi|3gp|3g2)";
my $audioExtensions = "\.(aiff|aac|wav|mp3|m4a|m4p|ogg|wma)";
my $appFileExtensions = "\.(on1|cos|cof)";
my $GPSFileExtensions = "\.(gpx|kml|kmz|log)";
# start main program
main();
рутина в вопросе
sub listKeywords {
print "Reads and displays file information from certain tags (typically set in Photomechanic):\n";
print "\t1. Subject\n";
print "\t2. Hierarchical Subject\n";
print "\t3. Supplemental Categories\n";
print "\t4. Label Name 1\n";
print "\t5. Label Name 2\n";
print "\t6. Label Name 3\n";
print "\t7. Label Name 4\n\n";
print "List Keywords ---\n\tEnter file name (with path) --> ";
my $filePath = <STDIN>;
chomp $filePath;
$filePath =~ s/\\//g;
$filePath =~ s/\s+$//;
########################################################
# COMMENT OUT THE FOLLOWING LINE AND NOTHING WORKS;
# $filePathXMP should be defined anyway, which suggests to
# me that the second invocation of ImageInfo doesn't actually occur.
# But I don't understand why.
$filePath =~ s/$photoExtensions$/.XMP/i;
print "\n\n";
my $filePathXMP = $filePath;
$filePathXMP =~ s/$photoExtensions$/.XMP/i; # TO FIX: filename may not have uppercase extension
# Get Exif information from image file
my $exifInfo = $exifTool->ImageInfo($filePath);
# my $exifInfoXMP = $exifToolXMP->ImageInfo($filePath =~ s/$photoExtensions$/.XMP/gi);
print "XMP Sidecar: \[$filePathXMP\]\n\n";
########################################################
# Get Specific Tag Value
my $hierarchicalSubject = $exifTool->GetValue('HierarchicalSubject');
my $subject = $exifTool->GetValue('Subject');
my $supplementalCategories = $exifTool->GetValue('SupplementalCategories');
my $labelName1 = $exifTool->GetValue('LabelName1');
my $labelName2 = $exifTool->GetValue('LabelName2');
my $labelName3 = $exifTool->GetValue('LabelName3');
my $labelName4 = $exifTool->GetValue('LabelName4');
my $exifInfo = ImageInfo($filePathXMP);
if (not defined $hierarchicalSubject) {$hierarchicalSubject = $exifTool->GetValue('HierarchicalSubject');}
if (not defined $hierarchicalSubject) {$hierarchicalSubject = "";}
if (not defined $subject) {$subject = $exifTool->GetValue('Subject');}
if (not defined $subject) {$subject = "";}
if (not defined $supplementalCategories) {$supplementalCategories = $exifTool->GetValue('SupplementalCategories');}
if (not defined $supplementalCategories) {$supplementalCategories = "";}
if (not defined $labelName1) {$labelName1 = $exifTool->GetValue('LabelName1');}
if (not defined $labelName1) {$labelName1 = "";}
if (not defined $labelName2) {$labelName2 = $exifTool->GetValue('LabelName2');}
if (not defined $labelName2) {$labelName2 = "";}
if (not defined $labelName3) {$labelName3 = $exifTool->GetValue('LabelName3');}
if (not defined $labelName3) {$labelName3 = "";}
if (not defined $labelName4) {$labelName4 = $exifTool->GetValue('LabelName4');}
if (not defined $labelName4) {$labelName4 = "";}
print "Subject:\n------------------------------\n$subject\n\n";
print "Hierarchical Subject:\n------------------------------\n$hierarchicalSubject\n\n";
print "Supplemental Categories:\n------------------------------\n$supplementalCategories\n\n";
print "Label Name 1:\n------------------------------\n$labelName1\n\n";
print "Label Name 2:\n------------------------------\n$labelName2\n\n";
print "Label Name 3:\n------------------------------\n$labelName3\n\n";
print "Label Name 4:\n------------------------------\n$labelName4\n\n";
}
1 ответ
Поскольку ваш код неполон, я должен спросить: вы позаботились о том, чтобы запустить скрипт со следующими строками?
use strict;
use warnings;
Эти две строки не для того, чтобы раздражать вас, они защитят вас от простых ошибок, которые вы могли допустить в своем коде.
ИМХО настоящая проблема с твоим sub listKeywords()
это следующая строка:
my $exifInfo = ImageInfo($filePathXMP);
Здесь есть две проблемы:
- вы переопределяете переменную
$exifInfo
из нескольких строк раньше. - Вы не используете подход ОО для 2-й информации об изображении.
Я думаю, что вы хотели написать следующую строку:
my $exifInfoXMP = $exifToolXMP->ImageInfo($filePathXMP);