Журнал LinuxFormat - перейти на главную

LXF143:exiftools

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(викификация, оформление, иллюстрация)
 
(Ис­поль­зу­ем скрип­ты)
Строка 39: Строка 39:
 
Вот как ра­бо­та­ет скрипт: для на­ча­ла он по­ме­ща­ет все фай­лы, ко­то­рые нуж­но от­сор­ти­ро­вать, в спе­ци­аль­но соз­дан­ный для это­го ка­та­лог. За­тем – и это един­ст­вен­ное, что вам придется сде­лать вруч­ную – надо под­го­то­вить про­стой тек­сто­вый файл '''notes_file.txt'''.
 
Вот как ра­бо­та­ет скрипт: для на­ча­ла он по­ме­ща­ет все фай­лы, ко­то­рые нуж­но от­сор­ти­ро­вать, в спе­ци­аль­но соз­дан­ный для это­го ка­та­лог. За­тем – и это един­ст­вен­ное, что вам придется сде­лать вруч­ную – надо под­го­то­вить про­стой тек­сто­вый файл '''notes_file.txt'''.
  
{{Врезка|Содержание=[[Изображение:LXF143_70_1.jpg|300px]] |Ширина=300px}
+
{{Врезка|Содержание=[[Изображение:LXF143_70_1.jpg|300px]] 1|Ширина=300px}
  
 
Он необ­хо­дим по­то­му, что мы пе­ре­име­но­вы­ва­ем, сор­ти­ру­ем и ар­хи­ви­ру­ем фо­то­гра­фии на осно­ве вре­мени их соз­дания. Для циф­ро­вых фо­то­гра­фий эти дан­ные на­хо­дят­ся в тэ­ге '''EXIF''' под на­званием '''DateTimeOriginal'''. Во всех осталь­ных слу­ча­ях мы долж­ны пре­доста­вить при­мер­ное зна­чение. Эти зна­чения мы и за­пи­сы­ва­ем в файл '''notes_file.txt''':
 
Он необ­хо­дим по­то­му, что мы пе­ре­име­но­вы­ва­ем, сор­ти­ру­ем и ар­хи­ви­ру­ем фо­то­гра­фии на осно­ве вре­мени их соз­дания. Для циф­ро­вых фо­то­гра­фий эти дан­ные на­хо­дят­ся в тэ­ге '''EXIF''' под на­званием '''DateTimeOriginal'''. Во всех осталь­ных слу­ча­ях мы долж­ны пре­доста­вить при­мер­ное зна­чение. Эти зна­чения мы и за­пи­сы­ва­ем в файл '''notes_file.txt''':

Версия 10:11, 5 июля 2012

ExifTool При­ве­ди­те свои фо­то в по­ря­док на­ши­ми удоб­ны­ми скрип­та­ми

Содержание

ExifTool: Фо­то по полочкам

Бес­по­ря­док в фо­то­гра­фи­ях мо­жет при­чи­нить вам не­ма­ло бес­по­койства, отчего и захворать недолго. К сча­стью, Мар­ко Фио­рет­ти на­шел ле­кар­ст­во.

Не так дав­но фо­то­гра­фии пред­став­ля­ли со­бой кар­точ­ки из глян­це­вой бу­ма­ги с цвет­ны­ми пят­на­ми на них, ко­то­рые с го­да­ми бе­реж­но на­ка­п­ли­ва­лись в кар­тон­ных ко­роб­ках и кра­си­вых аль­бо­мах. Се­го­дня по­яв­ление доступ­ных циф­ро­вых фо­то­ка­мер при­ве­ло к то­му, что ка­ж­дый год мы мо­жем де­лать сот­ни или ты­ся­чи но­вых сним­ков. Не­смот­ря на то, что они циф­ро­вые, их то­же нуж­но хранить.

Ути­ли­ты, по­доб­ные Digikam, несмот­ря на свои воз­мож­но­сти, не са­мый луч­ший ва­ри­ант для ор­ганиза­ции хранили­ща. По­это­му в этом ру­ко­во­дстве я ре­шил по­де­лить­ся с ва­ми по­лу­ав­то­ма­ти­че­­ской тех­но­ло­ги­ей, ко­то­рая по­зво­лит пе­ре­име­но­вать и от­сор­ти­ро­вать фо­то­гра­фии и по­мес­тить их в ар­хив. В ее осно­ве – ути­ли­та ExifTool и два про­стых скрип­та. Все это вы най­де­те на на­шем дис­ке. Для ра­бо­ты с ними необ­хо­ди­мо толь­ко об­щее пред­став­ление, что та­кое скрип­ты и как они ра­бо­та­ют.

Ка­ко­ва роль скрип­тов?

Мои скрип­ты де­ла­ют очень немно­гое, но ес­ли де­лать это вруч­ную, уй­дет мас­са ва­ше­го вре­мени. Во-пер­вых, они пе­ре­име­но­вы­ва­ют фай­лы, по­ме­чая ка­ж­дый из них да­той. За­тем они ав­то­ма­ти­че­­ски со­хра­ня­ют ка­ж­дую фо­то­гра­фию в ка­та­ло­ги, ко­то­рые так­же ие­рар­хи­че­­ски раз­би­ты по го­дам, ме­ся­цам и дням. С их по­мо­щью так­же мож­но до­ба­вить ком­мен­та­рии, рей­тин­ги и мет­ки к ва­шим фо­то­гра­фи­ям. Эти за­да­чи час­то луч­ше ре­ша­ют гра­фи­че­­ские про­грам­мы вро­де Digikam, но ес­ли сна­ча­ла упо­ря­до­чить ва­шу кол­лек­цию, то это сэ­ко­но­мит вам мас­су вре­мени.

А кро­ме то­го, ими до­воль­но про­сто поль­зо­вать­ся, ес­ли вы знае­те, что у них внут­ри, и имее­те неко­то­рое пред­став­ление о ме­та­дан­ных фо­то­гра­фий. По прав­де го­во­ря, са­мое слож­ное в дан­ной ста­тье – это не по­нять, как ра­бо­та­ют скрип­ты, а уяснить, по­че­му они долж­ны де­лать то или иное.

На­чи­на­ем с хао­са

Итак, од­на­ж­ды вы про­сну­лись и ре­ши­ли соз­дать од­ну, тща­тель­но упо­ря­до­чен­ную циф­ро­вую кол­лек­цию всех циф­ро­вых и бу­маж­ных фо­то­гра­фий, ко­то­рые вам не без­раз­лич­ны. Де­лать это вруч­ную – де­ло не про­сто дол­гое, но и без­на­деж­ное. Ве­ро­ят­но, вы столкнетесь со сле­дую­щи­ми за­да­ча­ми, в лю­бом со­че­тании: пер­вая – оциф­ров­ка бу­маж­ных фо­то­гра­фий, что скуч­но и тре­бу­ет вре­мени, но неслож­но. Что­бы сде­лать все бы­ст­рее, мож­но сканиро­вать по че­ты­ре фо­то­гра­фии за один раз с лю­бым сканером фор­ма­та A4 и со­хра­нять ре­зуль­та­ты в фай­лах с уникаль­ны­ми име­на­ми – спо­со­б, опи­сан­ным мной в LXF123.

Дру­гая оче­вид­ная необ­хо­ди­мость – ра­зо­брать­ся во всех фо­то­гра­фи­ях, ко­то­рые при­сла­ли дру­зья. Они мо­гут быть сде­ла­ны раз­ны­ми ка­ме­ра­ми или да­же та­кой же ка­ме­рой, как у вас. В пер­вом слу­чае на дис­ке поя­вят­ся фай­лы со все­ми из­вест­ны­ми че­ло­ве­че­­ст­ву и по­это­му несо­вмес­ти­мы­ми схе­ма­ми име­но­вания. Сотни фай­лов бу­дут иметь име­на вро­де XYZ_001.JPG, ..., XYZ_153.JPG, а дру­гие – име­на вро­де P00001.jpeg, ..., P99999.jpeg; и т. д. Ес­ли вам не по­ве­зет и у дру­зей най­дет­ся ана­ло­гич­ная ка­ме­ра, есть риск по­лу­чить несколь­ко фай­лов с оди­на­ко­вы­ми име­на­ми, пе­ре­запись ко­то­рых обернет­ся ка­та­ст­ро­фой, ес­ли не про­явить долж­но­го внимания.

Наи­худ­ший сце­на­рий по­яв­ля­ет­ся в слу­чае объ­е­динения са­мых до­сад­ных ха­рак­те­ри­стик двух вы­шеупо­мя­ну­тых про­блем. В этом слу­чае вы по­лу­чае­те фай­лы от­сканиро­ван­ных фо­то­гра­фий во всех гра­фи­че­­ских фор­ма­тах, от­кры­тых со вре­мен изо­бре­тения тран­зи­сто­ра. Бо­лее то­го, в их име­нах не бу­дет и сле­да поль­зы или смыс­ла. На­вер­ное, кто бы ни при­слал вам эти фай­лы, он под­со­­з­на­тель­но вас нена­ви­дит.

По­име­но­вать всю эту нераз­бе­ри­ху – на­ша пер­вая за­да­ча. В кон­це кон­цов, унифи­ци­ро­ван­ные име­на фай­лов – основ­ное усло­вие для эф­фек­тив­ной и пор­ти­руе­мой сис­те­мы управ­ления фо­то­гра­фия­ми. Для это­го есть несколь­ко кри­те­ри­ев, и глав­ный из них в том, что фо­то­гра­фии долж­ны остать­ся в от­дель­ных фай­лах на дис­ке в стан­дарт­ных фор­ма­тах. Ес­ли за­рыть фо­то­гра­фии в глу­би­нах ба­зы дан­ных, про­из­во­ди­тель­ность улуч­шит­ся, но этот ва­ри­ант ни в ко­ем слу­чае не под­хо­дит, ес­ли вы хо­ти­те иметь воз­мож­ность про­сто де­лать ре­зерв­ные ко­пии, а так­же даль­ше ук­ре­п­­лять кол­лек­цию.

По по­хо­жим при­чи­нам, а так­же по­то­му что име­на фай­лов долж­ны быть уникаль­ны, из­бе­гай­те в име­нах фай­лов сим­во­лов, не яв­ляю­щих­ся бу­к­ва­ми и циф­ра­ми. Опи­са­тель­ные на­звания то­же не под­хо­дят – на­звания ти­па Ма­мин_вы­пу­ск­ной.jpg мо­гут иметь смысл се­го­дня, но с го­да­ми вы бу­де­те му­чи­тель­но вспо­ми­нать: «От чьей это ма­мы? Моей или мо­ей вто­рой по­ло­вин­ки?» А как на­счет воз­рас­таю­щей ну­ме­ра­ции? О, нет. Она пе­ре­станет воз­рас­тать, а ста­ло быть, иметь смысл, когда при­дет­ся до­ба­вить фо­то­гра­фии в уже су­ще­ст­вую­щий аль­бом. Нет, наи­бо­лее пе­ре­но­си­мая, мас­шта­би­руе­мая и за­щи­щен­ная на бу­ду­щее схе­ма име­но­вания фай­лов – да­вать ка­ж­до­му фай­лу имя в со­от­вет­ст­вии с точ­ным вре­менем его соз­дания. Фай­лы с име­на­ми ви­да YYYYMMDDHHMMSS пе­ре­но­си­мы; име­на не слиш­ком длин­ные; их всегда мож­но от­сор­ти­ро­вать по да­те в лю­бой про­грам­ме, да­же ес­ли до­ба­вить или уда­лить фо­то­гра­фии из аль­бо­ма; и из них очень удоб­но де­лать ре­зерв­ные ко­пии, от­сор­ти­ро­ван­ные в хро­но­ло­ги­че­­ском по­ряд­ке. Ес­ли по­мес­тить все фо­то­гра­фии, сня­тые в оп­ре­де­лен­ный день или в оп­ре­де­лен­ный ме­сяц в один ка­та­лог с та­ким именем, как Year/Month или YearMonth, это толь­ко уп­ро­стит ин­дек­си­ро­вание.

Те­перь, оп­ре­де­лив­шись со схе­мой име­но­вания фай­лов, по­го­во­рим о ме­та­дан­ных, то есть о до­полнитель­ной ин­фор­ма­ции по ка­ж­дой фо­то­гра­фии. В них мо­жет хранить­ся поч­ти все что угод­но: от ав­то­ра и ко­пи­рай­та до уста­но­вок ка­ме­ры или ме­ток ка­те­го­рий. Су­ще­ст­ву­ет три основ­ных стан­дар­та ме­та­дан­ных фо­то­гра­фий, но мы со­сре­до­то­чим­ся на наи­бо­лее рас­про­странен­ном ва­ри­ан­те – фо­то­гра­фии в фор­ма­те JPEG с ме­та­дан­ны­ми EXIF (Exchangeable Image File Format).

Ме­та­дан­ные фо­то­гра­фии мо­гут хранить­ся ли­бо в фай­ле (как это про­ис­хо­дит с EXIF), ли­бо в ба­зе дан­ных. Пер­вый под­ход га­ран­ти­ру­ет, что они не бу­дут уте­ря­ны при пе­ре­но­се фо­то­гра­фий. Вто­рой зна­чи­тель­но уско­ря­ет по­иск и дру­гие опе­ра­ции. Лич­но я поль­зу­юсь обо­и­ми под­хо­да­ми сразу: сна­ча­ла за­пи­сы­ваю ме­та­дан­ные в фор­ма­те EXIF в фай­лы, за­тем, от­кры­вая свои аль­бо­мы в Digikam, ко­пи­рую эту ин­фор­ма­цию во внут­рен­нюю ба­зу дан­ных.

Ис­поль­зу­ем скрип­ты

Те­перь пе­рей­дем к кон­крет­но­му при­ме­ру – к си­туа­ции, по­ка­зан­ной на эк­ран­ном сним­ке выше. Здесь есть несколь­ко фо­то­гра­фий в раз­лич­ных фор­ма­тах, ко­то­рые нуж­но упо­ря­до­чить, ра­зо­брать и опо­знать. Об­ра­ти­те внимание, что для яс­но­сти при­ме­ра в на­шем ка­та­ло­ге со­дер­жит­ся толь­ко че­ты­ре фай­ла фо­то­гра­фий (и один тек­сто­вый файл, на­зна­чение ко­то­ро­го мы про­ясним чуть поз­же), но скрипт бу­дет ра­бо­тать и с ты­ся­ча­ми фай­лов. Не­ко­то­рые из изо­бра­жений – да­же не фо­то­гра­фии, а про­сто слу­чай­ные эк­ран­ные сним­ки. Я сде­лал это на­ме­рен­но, что­бы про­ил­лю­ст­ри­ро­вать ра­бо­ту скрип­тов. При необ­хо­ди­мо­сти лю­бую кар­тин­ку мож­но пре­об­ра­зо­вать в нечто го­раз­до бо­лее по­лез­ное – файл, с ко­то­рым бу­дет ра­бо­тать лю­бой менед­жер фо­то­гра­фий (с ме­та­дан­ны­ми и со всем осталь­ным), как ес­ли бы этот файл был снят циф­ро­вой ка­ме­рой.

Вот как ра­бо­та­ет скрипт: для на­ча­ла он по­ме­ща­ет все фай­лы, ко­то­рые нуж­но от­сор­ти­ро­вать, в спе­ци­аль­но соз­дан­ный для это­го ка­та­лог. За­тем – и это един­ст­вен­ное, что вам придется сде­лать вруч­ную – надо под­го­то­вить про­стой тек­сто­вый файл notes_file.txt.

{{Врезка|Содержание=LXF143 70 1.jpg 1|Ширина=300px}

Он необ­хо­дим по­то­му, что мы пе­ре­име­но­вы­ва­ем, сор­ти­ру­ем и ар­хи­ви­ру­ем фо­то­гра­фии на осно­ве вре­мени их соз­дания. Для циф­ро­вых фо­то­гра­фий эти дан­ные на­хо­дят­ся в тэ­ге EXIF под на­званием DateTimeOriginal. Во всех осталь­ных слу­ча­ях мы долж­ны пре­доста­вить при­мер­ное зна­чение. Эти зна­чения мы и за­пи­сы­ва­ем в файл notes_file.txt:

$ cat notes_file.txt
joe.jpg | 2001:01:01
Mom.JPEG | 1998:12:01
Mike.png
Dad.tiff | 2005:03:28

Как ви­ди­те, нуж­но толь­ко на­пи­сать име­на всех фай­лов фо­то­гра­фий, ко­то­рые на­хо­дят­ся в ка­та­ло­ге, по од­но­му в ка­ж­дой стро­ке. До­быть их спи­сок мож­но ко­ман­дой ls -l | cut -c45‑ > notes_file.txt. За­тем до­бавь­те по­сле сим­во­ла | вре­мя соз­дания ка­ж­дой фо­то­гра­фии в фор­ма­те YYYY:MM:DD. Ес­ли в со­седних стро­ках есть два или бо­лее фай­лов с оди­на­ко­вы­ми да­та­ми, до­бавь­те да­ту толь­ко к пер­во­му из них. Когда все бу­дет го­то­во, за­пусти­те в команд­ной стро­ке скрипт, пе­ре­дав ему пол­ный путь к это­му ка­та­ло­гу в ка­че­­ст­ве пер­во­го и един­ст­вен­но­го ар­гу­мен­та:

$ photo_archiver.sh $HOME/lxf_demo

Ра­бо­ту скрип­та с ка­ж­дым фай­лом от­ра­жа­ет ал­го­ритм, при­ве­ден­ный на ри­сун­ке.

Раз­би­ра­ем скрипт

Пер­вое, что мы де­ла­ем – со­хра­ня­ем ис­ход­ную вер­сию фай­ла, де­лая ра­бо­чую ко­пию. За­тем, при необ­хо­ди­мо­сти, эта ко­пия пре­об­ра­зу­ет­ся в фор­мат JPEG, так как нам ну­жен фор­мат, по­зво­ляю­щий хранить тэ­ги EXIF. Для это­го мы поль­зу­ем­ся ути­ли­той convert, вхо­дя­щей в со­став па­ке­та ImageMagick (http://www.imagemagick.org):

convert /tmp/my_tmp_photo /tmp/my_tmp_pic.jpg

За­тем мы об­ра­ба­ты­ва­ем тэ­ги EXIF с по­мо­щью ExifTool:

 1 DATE=`exiftool -s -f -DateTimeOriginal /tmp/my_tmp_pic.jpg | cut -d: -f2-`
 2
 3 if [$DATE” == “ -” ]
 4 DATE_FROM_NOTES=`$RETRIEVE_DATE notes_file.txt $PIC`
 5 if [$DATE_FROM_NOTES” == “NO_DATE_FOUND” ]
 6 then
 7 echo “NO_DATE_FOUND for $PIC, sorry!”
 8 exit
 9 else
 10 exiftool -DateTimeOriginal=”$DATE_FROM_NOTES 12:00:00” /tmp/my_tmp_pic.jpg
 11 fi
 12 fi

В пер­вой стро­ке ExifTool по­лу­ча­ет па­ра­метр EXIF под на­званием DateTimeOriginal из фай­ла JPEG и со­хра­ня­ет его, уда­лив все про­бе­лы и ненуж­ные фраг­мен­ты, в пе­ре­мен­ной $DATE. Ес­ли в ре­зуль­та­те этой опе­ра­ции мы по­лу­ча­ем пустую да­ту, мы про­сим retrieve_date_from_file.pl (он есть на на­шем DVD) из­влечь под­хо­дя­щую да­ту из фай­ла notes_file.txt. За­тем с по­мо­щью ExifTool мы за­пи­сы­ва­ем это зна­чение в файл JPEG. Об­ра­ти­те внимание, что скрипт всегда уста­нав­ли­ва­ет од­но и то же вре­мя (12:00:00). Ес­ли вам нуж­на боль­шая точ­ность, вве­ди­те бо­лее точ­ную да­ту в notes_file.txt и из­мените вто­рой вы­зов ExifTool со­от­вет­ст­вую­щим об­ра­зом.

Те­перь у нас поя­вил­ся файл в фор­ма­те JPEG my_tmp_pic.jpg, ко­то­рый со­дер­жит да­ту съем­ки в пе­ре­мен­ной EXIF DateTimeOriginal. За­тем вы­пол­ня­ет­ся сле­дую­щая часть скрип­та:

 1 NEWDATE=`exiftool -s -f -DateTimeOriginal /tmp/my_tmp_pic.jpg | cut -d: -f2- | tr -d “ :”`
 2 PARTIAL_DATE=`echo $NEWDATE | cut -c1-12`
 3 SECNDS=`echo$NEWDATE| cut -c13-14`
 4 mv /tmp/my_tmp_pic.jpg /tmp/$NEWDATE.jpg
 5 touch -t$PARTIAL_DATE.$SECNDS/tmp/$NEWDATE.jpg

Сна­ча­ла мы опять счи­ты­ва­ем да­ту, ликвидируем все про­бе­лы и двое­то­чия (ко­ман­да tr -d в кон­це пер­вой стро­ки) и на­зы­ва­ем ре­зуль­тат $NEWDATE. Фор­мат этой пе­ре­мен­ной – YYYYMMDDHHMMSS. Пер­вые 12 сим­во­лов этой стро­ки, оп­ре­де­ляю­щие да­ту и вре­мя с точ­но­стью до ми­ну­ты, за­пи­сы­ва­ют­ся в $PARTIAL_DATE. Два по­следних сим­во­ла, се­кун­ды, за­пи­сы­ва­ют­ся в пе­ре­мен­ную $SECNDS. Ско­ро вы пой­ме­те, за­чем это нуж­но.

При­чи­на, по ко­то­рой мы соз­да­ли пе­ре­мен­ную $NEWDATE, оче­вид­на из чет­вер­той стро­ки при­ве­ден­но­го фраг­мен­та: эта пе­ре­мен­ная нуж­на, что­бы пе­ре­име­но­вать вре­мен­ный файл в $NEWDATE.jpg. В пя­той стро­ке про­ис­хо­дит по­след­няя часть не та­кой уж и чер­ной ма­гии – в ней в то же зна­чение уста­нав­ли­ва­ет­ся вре­мя соз­дания фай­ла ко­ман­дой touch. К со­жа­лению, эта ути­ли­та рас­по­зна­ет се­кун­ды толь­ко по­сле точ­ки. По­это­му нам при­шлось соз­да­вать от­дель­но $PARTIAL_DATE и $SECNDS. В ито­ге по­сле вы­полнения скрип­та Mom.JPEG пре­вра­ща­ет­ся в 19981201120001.jpg:

$ ls -l 19981201120001.jpg
-rw-rw-r-- 1 marco marco 61909 Dec 1 1998 19981201120001.jpg
$ exiftool -s -f -DateTimeOriginal 19981201120001.jpg | cut -d: -f2- | tr -d “ :” 19981201120000

По­нят­но, что я имел в ви­ду? Те­перь у нас есть файл, чьи имя, вре­мя соз­да­ния и да­та съем­ки пол­но­стью сов­па­да­ют с EXIF! По­след­нее, что де­ла­ет скрипт photo_archiver.sh – по­ме­ща­ет ка­ж­дую фо­то­гра­фию в ка­та­лог с под­хо­дя­щим име­нем, соз­да­вая его, ес­ли такого еще нет:

 1 YEAR=`echo $NEWDATE | cut -c1-4`
 2 MONTH=`echo $NEWDATE | cut -c5-6`
 3 DAY=`echo $NEWDATE | cut -c7-8`
 4
 5 if [ ! -d$BASE_PHOTO_DIR/$YEAR/$MONTH/$DAY]
 6 then
 7 mkdir -p $BASE_PHOTO_DIR/$YEAR/$MONTH/$DAY
 8 fi
 9 mv /tmp/$NEWDATE.jpg $BASE_PHOTO_DIR/$YEAR/$MONTH/$DAY

В пер­вых трех стро­ках $NEWDATE раз­би­ва­ет­ся на год, ме­сяц и день. В стро­ках с 5 по 7 при необходимости соз­да­ет­ся ка­та­лог в со­от­вет­ст­вии с этой да­той, и файл пе­ре­ме­ща­ет­ся ту­да. В мо­ем слу­чае 19981201120001.jpg по­па­да­ет в ка­та­лог $BASE_PHOTO_DIR/1998/12/01.

{{Врезка|Содержание=LXF143 71 1.jpg Окончательный результат: у всех файлов приличные имена, тэги и расположение. Красотища!|Ширина=300px}

А те­перь на шаг от­сту­пим и восхи­тим­ся ре­зуль­та­та­ми ра­бо­ты скрип­та, по­ка­зан­ными на эк­ран­ном сним­ке. На ле­вой панели мы ви­дим, что скрипт соз­дал пра­виль­ную ие­рар­хию аль­бо­мов в ка­та­ло­ге $BASE_PHOTO_DIR (lxf_demo) со­глас­но имею­щим­ся дан­ным EXIF и со­дер­жи­мо­му фай­ла notes_file.txt. На цен­траль­ной панели и в ле­вом верхнем уг­лу мы ви­дим, что име­на фай­лов и вре­мя их соз­дания бы­ли из­менены со­от­вет­ст­вую­щим об­ра­зом. На­конец, на панели дан­ных EXIF мы ви­дим, что Digikam рас­по­зна­ет и ото­бра­жа­ет ис­ход­ную да­ту соз­дания фо­то­гра­фии, ко­то­рую скрипт про­пи­сал в EXIF.

Что еще нуж­но знать?

Внима­тель­ные чи­та­те­ли за­ме­тят в ко­де явную ошиб­ку. А вдруг най­дет­ся несколь­ко фо­то­гра­фий с оди­на­ко­вы­ми зна­чения­ми по­ля DateTimeOriginal? Не пе­ре­за­пи­шет ли ка­ж­дая их них пре­ды­ду­щую, ес­ли все они по­лу­чат оди­на­ко­вые име­на ви­да YYYYMMDDHHMMSS.jpg? Не от­чаи­вай­тесь, взгляните на эк­ран­ный снимок под окон­ча­тель­ны­ми ре­зуль­та­та­ми про­цес­са, и вы уви­ди­те, что фай­лов два, а не один. Де­ло в том, что скрипт про­ве­ря­ет, су­ще­ст­ву­ет ли уже файл с та­ким именем, и ес­ли да, то де­ла­ет гряз­ный, но эф­фек­тив­ный ход. Имя фай­ла – це­лое чис­ло, и ес­ли файл N.jpg уже есть, скрипт со­хра­ня­ет те­ку­щий файл под именем N+1.jpg.

Конеч­но, в на­шем ми­ре се­кун­ды все еще идут толь­ко от 0 до 59. Что де­лать, ес­ли най­дет­ся бо­лее 60 фо­то­гра­фий с оди­на­ко­вым зна­чением по­ля DateTimeOriginal? Все про­сто – у всех этих фо­то­гра­фий бу­дет оди­на­ко­вое кор­рект­ное вре­мя соз­дания в фор­ма­те Unix (как у 19981201120001.jpg), но толь­ко у пер­вых 60 имя фай­ла бу­дет со­от­вет­ст­во­вать вре­мени соз­дания. Ес­ли это ре­аль­ная, а не тео­ре­ти­че­­ская про­бле­ма, код нетруд­но из­менить, со­хранив уникаль­ность имен, на­при­мер, за счет до­полнитель­ных суф­фик­сов вро­де 19981201120001.aa.jpg, 19981201120001.ab.jpg

На­конец, JPEG – это фор­мат с по­те­рей ка­че­­ст­ва. Ес­ли у вас есть фо­то­гра­фии вы­со­ко­го ка­че­­ст­ва, сде­лать их JPEG-вер­сии очень удоб­но, но нуж­но так­же со­хранить все ис­ход­ные фай­лы и свя­зать их с JPEG-ко­пия­ми. Тогда – и это уп­ражнение оста­ет­ся вам, по­то­му что здесь про­сто не оста­лось на него мес­та – нуж­но пе­ре­име­но­вать ис­ход­ные фай­лы по то­му же шаб­ло­ну YYYYMMDDHHMMSS, но со­хранить ис­ход­ные рас­ши­рения.

Как обоб­щить этот ме­тод

На­пи­сать та­кой скрипт ста­ло воз­мож­ным бла­го­да­ря един­ст­вен­но­му усло­вию: спо­соб­но­сти ExifTool за­пи­сы­вать и счи­ты­вать тэ­ги да­ты. Од­на­ко в ме­та­дан­ных EXIF мож­но хранить го­раз­до боль­ше ин­фор­ма­ции. Так как ExifTool под­дер­жи­ва­ет все па­ра­мет­ры EXIF, с ее по­мо­щью мож­но ав­то­ма­ти­че­­ски уста­нав­ли­вать и лю­бые дру­гие па­ра­мет­ры. На­при­мер, из команд­ной стро­ки мож­но до­ба­вить опи­сание фо­то­гра­фии:

$ exiftool ‘-Description=this, instead, is a caption inserted with exiftool’ P1090097.JPG
$ exiftool -Keywords=’Montefeltro, family’ P1090097.JPG

Воз­мож­но­сти ExifTool на этом не за­кан­чи­ва­ют­ся. Я ав­то­ма­ти­че­ски до­ба­вил к сво­им фо­то­гра­фи­ям ши­ро­ту и дол­го­ту с по­мо­щью скрип­та из мое­го ру­ко­во­дства по гео­тэг­гин­гу (в LXF112). Те­перь в лю­бой про­грам­ме, под­дер­жи­ваю­щей ра­бо­ту с гео­тэгами, мож­но уви­деть, где бы­ли сня­ты мои фо­то­гра­фии. Ну не от­лич­ная ли шту­ка ExifTool?

За­пу­та­лись?

Ес­ли вы за­пус­ти­ли скрипт и по­лу­чи­ли не со­всем то, что ожи­да­ли, не от­чаи­вай­тесь. Во-пер­вых, Digikam – как и лю­бой дру­гой ме­нед­жер фо­то­гра­фий с ба­зой дан­ных – мо­жет син­хро­ни­зи­ро­вать из­ме­не­ния с тэ­га­ми EXIF не сра­зу. В Digikam вы­бе­ри­те Images > Reread Metadata From Images [Изо­бра­же­ния > Пе­ре­чи­тать ме­та­дан­ные из изо­бра­же­ний] в глав­ном ме­ню, и вы уви­ди­те свои из­ме­не­ния.

Так­же нуж­но знать, что и в EXIF, и в Digikam есть не­сколь­ко тэ­гов с да­той. На­при­мер, есть тэг, где хра­нит­ся да­та по­след­не­го из­ме­не­ния фай­ла. По­смот­ри­те на па­нель EXIF в Digikam или за­гля­ни­те в до­ку­мен­та­цию по ExifTool, что­бы най­ти дру­гие по­ля. Лич­но у ме­ня ни­ко­гда не бы­ло не­об­хо­ди­мо­сти на­пря­мую ра­бо­тать с до­пол­ни­тель­ны­ми тэ­га­ми. Но ес­ли вы за­хо­ти­те это сде­лать, все, что нуж­но – до­ба­вить не­сколь­ко строк в скрипт.

Как быть с про­бе­ла­ми?

Ос­нов­ной скрипт, с ко­то­рым мы имеем дело, не сра­бо­та­ет, ес­ли в име­нах фай­лов по­па­дут­ся про­бе­лы или спец­сим­во­лы. Я умыш­лен­но ис­клю­чил этот ва­ри­ант, по­то­му что, от­ка­зав­шись от не­го, лю­бой хо­ро­ший и слож­ный скрипт мож­но на­пи­сать го­раз­до бы­ст­рее и про­ще, хо­тя и Linux, и обо­лоч­ка спо­соб­ны ра­зобраться с та­кими сим­во­лами. По­это­му я ни­ко­гда не хра­ню фай­лы со стран­ны­ми име­на­ми сам и пе­ре­име­но­вы­ваю все фай­лы, по­лу­чен­ные от дру­гих, при пер­вой же воз­мож­но­сти. Впро­чем, вам не обя­за­тель­но впа­дать в эти край­но­сти. Что­бы об­ра­ба­ты­вать фай­лы со стран­ны­ми име­на­ми, про­сто за­ме­ни­те стро­ку for PIC... в мо­ем скрип­те пер­вы­ми че­тырь­мя стро­ка­ми скрип­та, ко­то­рый вы най­де­те по ад­ре­су http://www.cyberciti.biz/tips/handling-file-names-with-spaces-in-bash.html.

Как уда­лить ме­та­дан­ные EXIF?

За­пись ком­мен­та­ри­ев, тэ­гов и дру­гой ин­фор­ма­ции в фо­то­гра­фии, го­во­ря тех­ни­че­ским язы­ком, весь­ма здра­вый под­ход. Од­на­ко с точ­ки зре­ния взаи­мо­от­но­ше­ний он мо­жет стать гу­би­тель­ным. При­чи­на в том, что EXIF – все­мир­ный от­кры­тый стан­дарт, и дан­ные EXIF не шиф­ру­ют­ся. А зна­чит, ка­ж­дый, кто по­лу­чит ко­пию ва­шей фо­то­гра­фии, смо­жет про­честь и все ее ме­та­дан­ные. За­пе­чат­леть та­ким об­ра­зом те или иные фак­ты из жиз­ни – это пре­крас­но, и ни­что вам не ме­ша­ет обозначить ком­мен­та­рием «Ло­ша­ра» порт­ре­т ва­ше­го дя­дюш­ки, но пре­ж­де чем от­прав­лять ему фо­то­гра­фию по элек­трон­ной поч­те или за­гру­жать ее на Flickr, сде­лай­те ко­пию и вы­пол­ни­те сле­дую­щую ко­ман­ду, ко­то­рая очи­стит со­дер­жи­мое всех по­лей EXIF:

exiftool -all= uncle_portrait.jpg
Персональные инструменты
купить
подписаться
Яндекс.Метрика