Чи можна експортувати базу даних зображень Shotwell, зберігаючи всі теги?


14

Я імпортував багато фотографій у Shotwell і витратив деякий час на встановлення тегів. Чи ті теги заблоковані в Shotwell, чи я можу їх експортувати (та знову імпортувати або використовувати з іншим програмним забезпеченням)?

Відповіді:


22

Я засновник Йорби, виробників Shotwell. Дякуємо за запитання

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

Майбутній Shotwell 0.8 може записувати метадані у фотофайли на льоту - щоб увімкнути це, у діалоговому вікні налаштувань виберіть опцію " Записати теги, заголовки та інші метадані до фотофайлів " . Як тільки це буде вибрано, Shotwell оновлює метадані у фотофайлах, як тільки ви позначите їх. Щоб скористатися цією функцією, побудуйте магістраль Shotwell з джерела (див. Http://yorba.org/shotwell/install/#source ) або просто зачекайте на Shotwell 0.8 (який ми плануємо випустити пізніше в грудні).


+1 Я новий користувач Shotwell; дякую за всю вашу прекрасну роботу.
msw

3
Чи працює мета-тег "льоту" на зворотній основі?
hultqvist

@hultqvist, так, я просто перевірив варіант і постріл почав писати його на всі мої фотографії згодом
якийсь користувач

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.

Існує кілька фронталів GUI для sqlite, тут є один для firefox або ви можете використовувати sqliteman . Обидва ці передні кінці мають експорт до функцій csv; коли ви експортуєте свої теги до csv (значень, розділених комами), ви можете перевірити, чи будь-яке інше програмне забезпечення для управління фотографіями імпортує та відобразить теги у відповідне поле у ​​власних базах даних. Я вважаю, що Digikam може це зробити. Digikam також може вставляти дані exif у самі фотографії.

Сподіваємось, коли Shotwell набере більше можливостей, ця ситуація зміниться.

ОНОВЛЕННЯ. Хоча правда, що Shotwell 0.7 не зберігає свої теги на зображеннях, оскільки ці теги створюються, теги можуть бути вбудовані у зображення, якщо ви вирішите експортувати їх, дякую Адаму, що це зрозуміло. Сподіваємось, що цей експорт втрачає збитки при роботі з jpegs. Я підозрюю, що це так, якщо в діалоговому вікні експорту вибирається оригінальний розмір для параметра масштабування.


1
Під час експорту, якщо параметр "Масштабування" є оригінальним розміром, а фотографію не змінюється (відсутність коригування кольорів, обрізання тощо), воно не втрачає. Зауважте, що зміна орієнтації фотографії також втрачає втрати, оскільки ми використовуємо прапор EXIF, а не перекодуємо повернене зображення.
Джим Нельсон

Я вважаю, ви можете встановити прапорець "Написати теги, заголовки та інші метадані у фотофайли" у налаштуваннях Shetwell, щоб він міг записувати свої теги у файли зображень.
JellicleCat

2

Швидкий (брудний?) Код 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)

0

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

Я писав про jBrout у своєму блозі .

Щоб встановити його, перейдіть до Synaptic, виберіть налаштування / сховища, натисніть на вкладку "Інше програмне забезпечення", потім натисніть кнопку "Додати" та вставте в цей рядок:

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

Потім перезавантажте і шукайте jBrout.


0

Оскільки ~/.shotwell/data/photo.dbідентифіковано photo.db: SQLite 3.x databaseкомандою файлу, я SQLite Database Browser( sqlitebrowser) відкрив її.

Гммм ... ви можете прочитати :-) Він має функцію експорту CVS.

Це не звичайний підхід GUI, але є спосіб.


0

Я спробував використовувати сценарій 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.