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

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

14
задан 19 December 2010 в 05:49

6 ответов

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

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

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

23
ответ дан 19 December 2010 в 05:49

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

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

Это не обычный GUI подход, но есть способ.

0
ответ дан 19 December 2010 в 05:49

If you want a really good GUI tool/browser that let you tags your images using Exif tags (and therefore available in Shotwell too), Я рекомендую jBrout .

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

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

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

Затем перезагрузите и выполните поиск jBrout.

0
ответ дан 19 December 2010 в 05:49

Быстрый (грязный?) Код на 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)
2
ответ дан 19 December 2010 в 05:49

К сожалению, 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 есть несколько графических интерфейсов, для sqlite есть один для firefox здесь или вы можете использовать sqliteman. Оба этих фронта имеют экспорт в csv функции; при экспорте тегов в csv (Comma Separated Values) вы можете проверить, будет ли любая другая программа для управления фотографиями импортировать и сопоставить теги с соответствующим полем в их собственных базах данных. Я верю, что "Диджикам" может это сделать. Digikam также может встраивать exif-данные в сами фотографии.

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

UPDATE: Хотя это правда, что Shotwell 0.7 не хранит свои теги на фотографиях по мере того, как эти теги создаются, теги могут быть встраиваться в фотографии, если вы решите их экспортировать, спасибо Адаму, что разъяснил это. Надеюсь, что этот экспорт будет без потерь при работе с jpegs. Подозреваю, что это так, если выбрать исходный размер для опции Scaling в диалоге экспорта.

9
ответ дан 19 December 2010 в 05:49

Я попытался использовать сценарий 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'
0
ответ дан 19 December 2010 в 05:49

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

Похожие вопросы: