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