Ответы:
Я основатель Yorba, создатели Shotwell. Спасибо за ваш вопрос.
Shotwell 0.7 записывает метаданные (такие как теги и заголовки) к фотографиям при их экспорте. Метаданные записываются в формате EXIF, IPTC и / или XMP (в зависимости от того, какие из них присутствовали на фотографии для начала). Большинство других программ для работы с фотографиями могут считывать эти форматы, поэтому, если вы экспортируете свои фотографии из Shotwell, другие программы смогут без проблем читать их теги.
Предстоящий Shotwell 0.8 может записывать метаданные в файлы фотографий на лету - чтобы включить это, выберите параметр « Записывать метки, заголовки и другие метаданные в файлы фотографий » в диалоговом окне настроек . Как только это выбрано, Shotwell обновит метаданные в файлах фотографий, как только вы отметите их. Чтобы использовать эту функцию, создайте магистраль Shotwell из исходного кода (см. Http://yorba.org/shotwell/install/#source ) или просто подождите, пока Shotwell 0.8 (которую мы планируем выпустить позже в декабре).
К сожалению, 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. Я подозреваю, что это так, если выбрать один из оригинальных размеров для параметра «Масштаб» в диалоговом окне экспорта.
Быстрый (грязный?) Код на 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)
Если вам нужен действительно хороший инструмент / браузер с графическим интерфейсом, который позволит вам помечать изображения с помощью тегов Exif (и, следовательно, также доступны в Shotwell), я рекомендую jBrout .
Я написал о jBrout в своем блоге .
Чтобы установить его, перейдите в Synaptic, выберите настройки / репозитории, нажмите на вкладку «Другое программное обеспечение», затем нажмите кнопку «Добавить» и вставьте в эту строку:
deb http://jbrout.free.fr/download/debian binary /
Затем перезагрузите и найдите jBrout.
Поскольку ~/.shotwell/data/photo.db
определяется как photo.db: SQLite 3.x database
команда файла, я использовал SQLite Database Browser
( sqlitebrowser
), чтобы открыть его.
Хммм ... вы можете прочитать это :-) Он имеет функцию экспорта CVS.
Это не нормальный подход с графическим интерфейсом, но есть способ.
Я попытался использовать скрипт 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'