Відповіді:
Я засновник Йорби, виробників 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.
Існує кілька фронталів GUI для sqlite, тут є один для firefox або ви можете використовувати sqliteman . Обидва ці передні кінці мають експорт до функцій csv; коли ви експортуєте свої теги до csv (значень, розділених комами), ви можете перевірити, чи будь-яке інше програмне забезпечення для управління фотографіями імпортує та відобразить теги у відповідне поле у власних базах даних. Я вважаю, що Digikam може це зробити. Digikam також може вставляти дані exif у самі фотографії.
Сподіваємось, коли Shotwell набере більше можливостей, ця ситуація зміниться.
ОНОВЛЕННЯ. Хоча правда, що Shotwell 0.7 не зберігає свої теги на зображеннях, оскільки ці теги створюються, теги можуть бути вбудовані у зображення, якщо ви вирішите експортувати їх, дякую Адаму, що це зрозуміло. Сподіваємось, що цей експорт втрачає збитки при роботі з jpegs. Я підозрюю, що це так, якщо в діалоговому вікні експорту вибирається оригінальний розмір для параметра масштабування.
Швидкий (брудний?) Код python, щоб зробити це без оновлення Shotwell (я думаю, що на 0.8.x Shotwell може виписати теги, але ви не можете оновити його до Lucid). Ця річ випише зірки-рейтинги як теги (коментуйте це, однак, якщо ви цього не хочете).
Потрібен exiftool. Він буде дублювати будь-які теги, що знаходяться як у базі даних про пошкодження, так і на зображення (тобто ті, які 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.
Це не звичайний підхід GUI, але є спосіб.
Я спробував використовувати сценарій user38122 для розбору бази даних пошкоджених матеріалів, і це не спрацювало. Мабуть, схема була змінена в останніх версіях. Натомість я написав наступний скрипт, який використовує панди (які я особисто вважаю за краще писати SQL), щоб робити перетини тегів. У наведеному нижче прикладі я показую всі зображення, що мають як тег "cat", так і тег "sleep".
#!/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'