Добавление данных в поле IPTC с использованием Perl

Я хочу установить пользовательский текст в поле IPTC "Специальные инструкции" в Perl.

Как это можно сделать без использования модуля?

1 ответ

Решение

Обновлен снова

Итак, в свете вашего нового требования фактически прочитать, изменить и затем переписать информацию IPTC, вы можете использовать следующее для чтения информации IPTC, пока мы не найдем что-то лучшее:

print $image->Identify();

что дает это:

stuff ..
...
Profiles:
  Profile-8bim: 44 bytes
  Profile-iptc: 32 bytes
    Special Instructions[2,40]: Handle with care.
    Credit[2,110]: Mark
...
...

Ммм... кажется, что эта информация пишется stdoutи я не знаю, как это запечатлеть. Поэтому я провел дальнейшее расследование и могу также получить информацию об IPTC:

$profile=$image->Get('IPTC');

что дает это:

0000000      021c    0028    4811    6e61    6c64    2065    6977    6874
         034 002   (  \0 021   H   a   n   d   l   e       w   i   t   h
0000020      6320    7261    2e65    021c    006e    4d04    7261    006b
               c   a   r   e   . 034 002   n  \0 004   M   a   r   k  \0

Таким образом, похоже, что отдельные поля IPTC разделены:

1c - a single byte marker
byte - IPTC page
byte - IPTC field number
2 bytes - length of following field
<FIELD> - the actual data

Итак, вы можете прочитать их и создать свой файл IPTC.txt следующим образом:

#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;

my ($image,$x,$profile,$id);
$image=Image::Magick->new(size=>'256x128');
$image->ReadImage('out.jpg');

$profile=$image->Get('IPTC');
my @items=split /\x1c/,$profile;
shift @items; # Discard emptiness before first separator
foreach (@items) {
   my $page=ord(substr($_,0,1));
   my $field=ord(substr($_,1,1));
   my $value=substr($_,4); # rest
   print "$page#$field=\"$value\"\n";
}

С моим тестовым файлом я получаю следующий вывод:

2#110="CREDITCREDITCREDITCREDIT"
2#5="OBJECT"
2#115="SOURCE"
2#116="COPYRIGHT"
2#118="CONTACT"
2#120="CAPTION"

Затем вы можете установить данные IPTC, используя Perl API, следующим образом, используя файл IPTC.txt дальше:

$image->Mogrify("profile",'8BIMTEXT:IPTC.txt');

Следующее не является разумной, полной программой само по себе, но она показывает, как использовать методы, которые я предлагаю:

#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;

my ($image,$x,$profile);
$image=Image::Magick->new(size=>'256x128');
$image->ReadImage('out.jpg');
print $image->Identify();                          # Get IPTC info - to screen but you can put it in a variable obviously
$image->Mogrify("profile",'8BIMTEXT:IPTC.txt');    # Write IPTC info
$image->Write('out.jpg');                          # Output image with new IPTC info

обновленный

Я добился небольшого прогресса... Я могу читать атрибуты IPTC из изображения, используя Perl API. Например, следующий текст будет считывать кредит IPTC:

$credit=$image->Get('IPTC:2:110');

Оригинальный ответ

Я работаю над этим, но следующего может быть достаточно, чтобы вы все равно начали, прежде чем я закончу!

Если я создам такой файл и назову его IPTC.txt

2#40#Special Instructions="Handle with care."
2#110#Credit="Mark"

а затем использовать ImageMagick convert как это:

convert out.jpg -profile 8BIMTEXT:IPTC.txt out.jpg

Я могу вставить информацию IPTC. Затем я могу проверить это с помощью jhead следующее:

jhead out.jpg
File name    : out.jpg
File size    : 18899 bytes
File date    : 2014:09:24 11:41:23
Resolution   : 1024 x 768
Color/bw     : Black and white
JPEG Quality : 86
======= IPTC data: =======
Spec. Instr.  : Handle with care.
Credit        : Mark

Я знаю, что вы не хотите раскошелиться, но мы надеемся, что это поможет нам понять, как это сделать с помощью имеющегося у вас модуля CPAN. Кстати, какой у вас есть?

Другие вопросы по тегам