Можно ли экспортировать базу данных фотографий Shotwell, сохранив все теги?

14

Я импортировал много фотографий в Shotwell и провел некоторое время, устанавливая теги. Эти метки заблокированы в Shotwell, или я могу их экспортировать (и импортировать снова или использовать с другим программным обеспечением)?

Иван
источник

Ответы:

22

Я основатель Yorba, создатели Shotwell. Спасибо за ваш вопрос.

Shotwell 0.7 записывает метаданные (такие как теги и заголовки) к фотографиям при их экспорте. Метаданные записываются в формате EXIF, IPTC и / или XMP (в зависимости от того, какие из них присутствовали на фотографии для начала). Большинство других программ для работы с фотографиями могут считывать эти форматы, поэтому, если вы экспортируете свои фотографии из Shotwell, другие программы смогут без проблем читать их теги.

Предстоящий Shotwell 0.8 может записывать метаданные в файлы фотографий на лету - чтобы включить это, выберите параметр « Записывать метки, заголовки и другие метаданные в файлы фотографий » в диалоговом окне настроек . Как только это выбрано, Shotwell обновит метаданные в файлах фотографий, как только вы отметите их. Чтобы использовать эту функцию, создайте магистраль Shotwell из исходного кода (см. Http://yorba.org/shotwell/install/#source ) или просто подождите, пока Shotwell 0.8 (которую мы планируем выпустить позже в декабре).

Адам Дингл
источник
+1 Я новый пользователь Shotwell; спасибо за всю вашу прекрасную работу.
MSS
3
Работает ли запись мета-тега «на лету» задним числом?
Hultqvist
@hultqvist, да, я только что проверил эту опцию и Shotwell начал писать ее для всех моих фотографий впоследствии
какой-то пользователь
9

К сожалению, Shotwell, похоже, хранит теги в своей собственной базе данных, а не встраивает их в изображения как exif, IPTC или XMP. Вы можете проверить это с помощью exiftool, который можно установить, установив пакет libimage-exiftool-perl , доступный в репозиториях.

Смотрите некоторые примеры здесь

используйте команду; exiftool testpicture.jpgчтобы проверить фотографию с именем testpicture.jpg, которую вы ранее отмечали с помощью Shotwell. Вы увидите, что вывод exiftool не содержит тегов Shotwell.

Утилита exiftool может помечать ваши фотографии, встраивая теги в фотографию, и хорошо то, что большинство менеджеров фотографий будут использовать их, включая Shotwell. Например:

exiftool -keywords=favourite -keywords=family testpicture.jpg

Замените существующий список ключевых слов двумя новыми ключевыми словами (избранное и семейное).

Когда testpicture.jpg импортируется в Shotwell, изображение будет помечено как любимое и семья

Может быть полезно знать, что база данных Shotwell является базой данных sqlite, расположенной в вашей; ~/.shotwell/dataкаталог и обычно называется photo.db, вы можете скопировать его в другое место на вашем компьютере и получить доступ к нему с помощью sqlite.

Для sqlite есть несколько интерфейсов GUI, здесь есть один для Firefox, или вы можете использовать sqliteman . Оба эти интерфейса имеют экспорт в функции CSV; Когда вы экспортируете свои теги в CSV (значения, разделенные запятыми), вы можете проверить, будет ли импортироваться любое другое программное обеспечение для управления фотографиями, и сопоставить теги с соответствующим полем в их собственных базах данных. Я верю, что Digikam может сделать это. Digikam также может вставлять exif-данные в сами фотографии.

Надеюсь, что по мере того, как Shotwell получит больше возможностей, эта ситуация изменится.

ОБНОВЛЕНИЕ: Несмотря на то, что Shotwell 0.7 действительно не сохраняет свои теги на изображениях при создании этих тегов, теги могут быть встроены в изображения, если вы решите их экспортировать, спасибо Адаму за разъяснение этого. Надеемся, что этот экспорт без потерь при работе с JPEG. Я подозреваю, что это так, если выбрать один из оригинальных размеров для параметра «Масштаб» в диалоговом окне экспорта.

Sabacon
источник
1
Во время экспорта, если для параметра «Масштаб» выбрано значение «Исходный размер», а фотография не отредактирована (без корректировки цвета, обрезки и т. Д.), Она не теряется. Обратите внимание, что изменение ориентации фотографии также без потерь, поскольку мы используем флаг EXIF, а не перекодируем повернутое изображение.
Джим Нельсон
Я полагаю, что вы можете установить флажок «Записывать теги, заголовки и другие метаданные в файлы фотографий» в настройках Shetwell, чтобы он записывал свои теги в файлы изображений.
JellicleCat
2

Быстрый (грязный?) Код на python, чтобы сделать это без обновления Shotwell (я думаю, что с 0.8.x Shotwell может записывать теги, но вы не можете обновить его до Lucid). Эта вещь будет записывать звездные рейтинги в виде тегов (очевидно, если вы этого не хотите, оставьте комментарий).

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

import os
conn = sqlite3.connect("/home/  username  /.shotwell/data/photo.db")

def get_tags():
    return [ x[0] for x in conn.execute("SELECT name FROM TagTable").fetchall()]

def tag_query(tag):
    return conn.execute("SELECT photo_id_list FROM TagTable WHERE name=?", (tag,)).fetchone()[0].split(",")

def get_tagged_photos(tag):
    for id in tag_query(tag):
        result = conn.execute("select filename from PhotoTable where id=?", (id,) ).fetchone()
        if result:
            yield result[0]

def get_photos_by_rating(rating):
    return [photo[0] for photo in conn.execute("select filename from PhotoTable where rating=?",(rating,)).fetchall()]

def get_tagging_commands():
    commands = []
    for rating in range(1,5):
        for photo in get_photos_by_rating(rating):
             commands.append("exiftool -overwrite_original_in_place -preserve -keywords+=rating%d \"%s\""% (rating,photo))

    for tag in [tag for tag in get_tags() if tag != "keep"]:
        for photo in get_tagged_photos(tag):
             commands.append("exiftool -overwrite_original_in_place -preserve -keywords+=%s \"%s\"" % (tag,photo))

    return commands

commands = get_tagging_commands()
for command in commands:
    print command
    os.system(command)
user38122
источник
0

Если вам нужен действительно хороший инструмент / браузер с графическим интерфейсом, который позволит вам помечать изображения с помощью тегов Exif (и, следовательно, также доступны в Shotwell), я рекомендую jBrout .

Я написал о jBrout в своем блоге .

Чтобы установить его, перейдите в Synaptic, выберите настройки / репозитории, нажмите на вкладку «Другое программное обеспечение», затем нажмите кнопку «Добавить» и вставьте в эту строку:

deb http://jbrout.free.fr/download/debian binary /

Затем перезагрузите и найдите jBrout.

Scaine
источник
0

Поскольку ~/.shotwell/data/photo.dbопределяется как photo.db: SQLite 3.x databaseкоманда файла, я использовал SQLite Database Browser( sqlitebrowser), чтобы открыть его.

Хммм ... вы можете прочитать это :-) Он имеет функцию экспорта CVS.

Это не нормальный подход с графическим интерфейсом, но есть способ.

Осаму Аоки
источник
0

Я попытался использовать скрипт user38122 для анализа базы данных Shotwell, но он не сработал. Видимо схема была изменена в последних версиях. Вместо этого я написал следующий скрипт, который использует панд (которые я лично предпочитаю писать SQL) для пересечения тегов. В приведенном ниже примере я показываю все изображения с тегом «кошка» и «спящий».

#!/usr/bin/python

# An example of how to query the shotwell database with pandas
import sqlite3, pandas, os, time, datetime

con = sqlite3.connect('/home/dov/.local/share/shotwell/data/photo.db')
photo_df = pandas.read_sql("SELECT * from PhotoTable", con)

for c in ['exposure_time','timestamp','time_created']:
  photo_df[c] = photo_df[c].map(datetime.datetime.fromtimestamp)

tag_df = pandas.read_sql('SELECT * from TagTable', con)

def get_image_ids(tag):
  """The image ids are stored morphed in the database as %016x"""
  global tag_df

  return set([int(s.replace('thumb',''),16)
              for s in tag_df[tag_df.name==tag].photo_id_list.iloc[0].split(',')
              if len(s)])

def get_photos(ids):
  """Get the photos for a list of ids"""
  global photo_df
  return photo_df[photo_df.id.isin(ids)].sort(['exposure_time'])

def view_pix(rows):
  cmd = ('eog ' + ' '.join(['"%s"'%row.filename
                            for idx,row in rows.iterrows()]))
#  print cmd
  os.system(cmd)

print 'querying...'

# An example of how to create an intersection of two tags
ids1 = get_image_ids('cat')
ids2 = get_image_ids('sleeping')
rows = get_photos(ids1.intersection(ids2))

# An example of how to filter the rows by timestamp
time_low,time_high = datetime.datetime(2006,8,1),datetime.datetime(2009,1,1)
rows = rows[(rows.exposure_time > time_low)
            & (rows.exposure_time < time_high)]
print '\n'.join([str(ts) for ts in rows['exposure_time']])
view_pix(rows)

print 'done'
Дов Гробгельд
источник