Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Пакетное изменение exif, iptc, xmp в jpeg - bash-script, nautilus-script  (Прочитано 2006 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GoKerze

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Задача:

Конвертировать метаданные JPEG введенные через Shotwell 0.18.0 (Ubuntu 14.04 64bit) в формат пригодный для чтения в "Фотоальбом Windows Live 2012".

Что не так:

Если открыть фотографии "Фотоальбомом Windows" мы увидим наши теги в правильной кодировке и их же еще раз кракозябрами — задвоение тегов. Мы не увидим "Комментарий".

Куда я копаю:

Я создал два пустых jpg-файла и добавил в них метаданные: в один Shotwell'ом, в другой «Фотоальбомом Windows». Записал по два тега, заголовок и комментарий.

Посмотрел на результат утилитой exiv2:

exiv2 -Pkyct *.jpg
Shotwell:
Exif.Image.Orientation                       Short       1  top, left
Exif.Image.Software                          Ascii      16  Shotwell 0.18.0
Exif.Image.ExifTag                           Long        1  66
Exif.Photo.UserComment                       Undefined  31  ShotwellComment_Рус_
Exif.Photo.PixelXDimension                   SLong       1  640
Exif.Photo.PixelYDimension                   SLong       1  400
Iptc.Application2.Program                    String      8  Shotwell
Iptc.Application2.ProgramVersion             String      6  0.18.0
Iptc.Application2.Caption                    String     20  ShotwellName_Рус_
Iptc.Application2.Headline                   String     20  ShotwellName_Рус_
Iptc.Application2.Keywords                   String     21  ShotwelLabel1_Рус_
Iptc.Application2.Keywords                   String     21  ShotwelLabel2_Рус_
Xmp.photoshop.Headline                       XmpText    20  ShotwellName_Рус_
Xmp.exif.PixelXDimension                     XmpText     3  640
Xmp.exif.PixelYDimension                     XmpText     3  400
Xmp.tiff.ImageWidth                          XmpText     3  640
Xmp.tiff.ImageHeight                         XmpText     3  400
Xmp.tiff.Orientation                         XmpText     1  top, left
Xmp.dc.title                                 LangAlt     1  lang="x-default" ShotwellName_Рус_
Xmp.dc.subject                               XmpBag      2  ShotwelLabel1_Рус_, ShotwelLabel2_Рус_

Фотоальбом Windows:
Exif.Image.ImageDescription                  Ascii      17  WindowsName_Рус_
Exif.Image.ExifTag                           Long        1  2140
Exif.Image.XPTitle                           Byte       34  WindowsName_Рус_
Exif.Image.XPKeywords                        Byte       68  WindowsTag1_Рус_;WindowsTag2_Рус_
Exif.Image.XPComment                         Byte       30  WindowsComment_Рус_
Xmp.dc.subject                               XmpBag      2  WindowsTag1_Рус_, WindowsTag2_Рус_
Xmp.dc.title                                 LangAlt     1  lang="x-default" WindowsName_Рус_
Xmp.dc.description                           LangAlt     1  lang="x-default" WindowsName_Рус_
Xmp.MicrosoftPhoto.LastKeywordXMP            XmpBag      2  WindowsTag1_Рус_, WindowsTag2_Рус_
Xmp.xmpMM.InstanceID                         XmpText    41  uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b

Что получается:

Обе программы используют Xmp.dc.title и Xmp.dc.subject. Значит, надо удалить спецфичные для Shotwell данные (например Iptc.Application2.Keywords) и скопировать Exif.Photo.UserComment в Xmp.dc.title.

Да, Windows может писать комментарий в Exif.Image.XPComment. Но такой комментарий можно увидеть лишь открыв свойства файла на вкладке "Подробно". "Фотоальбом Windows" Exif.Image.XPComment не показывает.

Решение:

Напрашивается Bash-скрипт, но я не умею их писать. Однако! В Ubuntu есть Nautilus со своими скриптами (сценариями). Кладем в папку ~/.local/share/nautilus/scripts файлик "SuperScript.sh" с правами на исполнение и следующим содержимым:

#!/bin/sh
#
# GNU/GPL owning
# nautilus-script "Delete Shotwell tags"
#

for arg
do

    # Удаляем лишнее
    exiv2 -M"del Xmp.photoshop.Headline" -M"del Iptc.Application2.Keywords" -M"del Iptc.Application2.Program" -M"del Iptc.Application2.ProgramVersion" -M"del Iptc.Application2.Caption" -M"del Iptc.Application2.Headline" -M"del Exif.Image.Software" $arg

    # Копируем Exif.Photo.UserComment в Xmp.dc.title
    exiv2 -M"set Xmp.dc.title $(exiv2 -Pv -g Exif.Photo.UserComment $arg)" $arg

done

Пробуем. Выделяем пару картинок. Запускаем скрипт. И оппа! Shotwell пишет комментарий в Exif.Photo.UserComment, видимо, с недавних пор. В старых фотографиях такого поля нет. Значит, надо заставить его перезаписать метаданные на всех фотографиях. Выделяем все 4000 фотографий, добавляем тег "ILikeLinux". Ждем.

Теперь у всех фотографий с комментарием комментарий записан в Exif.Photo.UserComment. Можно запускать скрипт. И тут выясняется, что nautilus-script даже не пытается работать над группой файлов более 10-20 штук.

Цитировать
Бой проигран, но война не окончена.

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
если arg это имя файла, то так:

Код: (bash) [Выделить]
#!/bin/bash

# Будут обработаны все файлы .jpg в текущей директории (откуда запущен скрипт)

find -maxdepth 1 -type f -iname "*.jpg" | while read IMG_FILE; do
# Удаляем лишнее
exiv2 \
-M "del Xmp.photoshop.Headline" \
-M "del Iptc.Application2.Keywords" \
-M "del Iptc.Application2.Program" \
-M "del Iptc.Application2.ProgramVersion" \
-M "del Iptc.Application2.Caption" \
-M "del Iptc.Application2.Headline" \
-M "del Exif.Image.Software" "$IMG_FILE"

# Копируем Exif.Photo.UserComment в Xmp.dc.title
exiv2 \
-M "set Xmp.dc.title $(exiv2 -Pv -g Exif.Photo.UserComment $IMG_FILE)" "$IMG_FILE"
done

а если имя файла с путем, то после do добавь:
IMG_FILE="$(basename -z "$IMG_FILE")"
« Последнее редактирование: 23 Декабря 2015, 21:36:07 от Cxms »

Оффлайн GoKerze

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Cxms, большое спасибо за скрипт! Есть одна опечатка: не хватает кавычек вокруг $IMG_FILE.

Убрал параметр maxdepth - нужно обрабатывать поддиректории. Добавил вывод пути текущего файла - для спокойствия. Скрипт принял следующий вид:

#!/bin/bash
 
# Будут обработаны все файлы .jpg в текущей директории (откуда запущен скрипт) и в поддиректориях
 
find -type f -iname "*.jpg" | while read IMG_FILE; do

# Чтоб знать, что не зависло
echo "$IMG_FILE"

# Удаляем лишние метаданные
exiv2 \
-M "del Xmp.photoshop.Headline" \
-M "del Iptc.Application2.Keywords" \
-M "del Iptc.Application2.Program" \
-M "del Iptc.Application2.ProgramVersion" \
-M "del Iptc.Application2.Caption" \
-M "del Iptc.Application2.Headline" \
-M "del Exif.Image.Software" "$IMG_FILE"
 
# Копируем Exif.Photo.UserComment в Xmp.dc.title
exiv2 -M "set Xmp.dc.title $(exiv2 -Pv -g Exif.Photo.UserComment "$IMG_FILE")" "$IMG_FILE"

done

При обработке некоторых файлов выдавались сообщения вида:

Warning: Directory OlympusCs, entry 0x0101: Strip 0 is outside of the data area; ignored.
Warning: Directory Pentax, entry 0x0004: Data area exceeds data buffer, ignoring it.

Как я понял, exiv2 ругался на корявые метаданные. Ругался, но задание выполнил успешно.

Цитировать
Люди делятся на два типа: тех кто не делает бэкапы, и тех кто уже делает.

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
GoKerze,
Там (в последней строке) и без ковычек должно работать с пробелами в именах.
Но если фэйлило о несущ. именах, - то значит ковычки нужны.

 

Страница сгенерирована за 0.047 секунд. Запросов: 25.