Odpowiedzi:
Jestem założycielem Yorby, twórcy Shotwell. Dziękuję za twoje pytanie.
Shotwell 0.7 zapisuje metadane (takie jak tagi i tytuły) na zdjęciach podczas ich eksportowania. Metadane są zapisywane w formacie EXIF, IPTC i / lub XMP (w zależności od tego, które z nich były na początku na zdjęciu). Większość innych programów fotograficznych może odczytywać te formaty, więc jeśli eksportujesz swoje zdjęcia ze Shotwell, inne programy powinny mieć możliwość odczytu ich tagów bez problemu.
Nadchodzący Shotwell 0.8 może zapisywać metadane do plików zdjęć w locie - aby to włączyć, wybierz opcję „ Zapisuj tagi, tytuły i inne metadane do plików zdjęć ” w oknie dialogowym preferencji . Po wybraniu tej opcji Shotwell zaktualizuje metadane w plikach zdjęć, jak tylko je otagujesz. Aby skorzystać z tej funkcji, zbuduj pień Shotwell ze źródła (patrz http://yorba.org/shotwell/install/#source ) lub po prostu poczekaj na Shotwell 0.8 (który planujemy wydać później w grudniu).
Niestety, Shotwell wydaje się przechowywać tagi we własnej bazie danych zamiast osadzać je jako exif, IPTC lub XMP na zdjęciach. Możesz to sprawdzić za pomocą exiftool, który można zainstalować, instalując pakiet libimage-exiftool-perl , dostępny w repozytoriach.
użyj polecenia; exiftool testpicture.jpg
aby sprawdzić zdjęcie o nazwie testpicture.jpg, które wcześniej oznaczyłeś tagiem Shotwell. Zobaczysz, że wyjście exiftool nie zawiera tagów Shotwell.
Narzędzie exiftool może oznaczać twoje zdjęcia, umieszczając tagi na zdjęciu, a dobrą rzeczą jest to, że większość menedżerów zdjęć będzie z nich korzystać, w tym Shotwell. Na przykład:
exiftool -keywords=favourite -keywords=family testpicture.jpg
Zastąp istniejącą listę słów kluczowych dwoma nowymi słowami kluczowymi (ulubionym i rodzinnym).
Po zaimportowaniu pliku testpicture.jpg do Shotwell zdjęcie zostanie oznaczone jako ulubione i rodzinne
Pomocna może być informacja, że baza danych Shotwell jest bazą danych sqlite w twoim; ~/.shotwell/data
katalogu i zwykle nazywa się photo.db, możesz skopiować go gdzie indziej na komputerze i uzyskać do niego dostęp za pomocą narzędzia sqlite.
Istnieje kilka nakładki GUI dla SQLite, jest jeden dla Firefoksa tutaj lub użyć sqliteman . Oba te interfejsy mają funkcje eksportu do csv; kiedy eksportujesz swoje tagi do csv (wartości rozdzielane przecinkami), możesz sprawdzić, czy jakiekolwiek inne oprogramowanie do zarządzania zdjęciami zaimportuje i zamapuje tagi na odpowiednie pola we własnych bazach danych. Wierzę, że Digikam może to zrobić. Digikam może również osadzać dane exif na samych zdjęciach.
Mamy nadzieję, że wraz ze wzrostem liczby funkcji Shotwell sytuacja się zmieni.
AKTUALIZACJA: Chociaż prawdą jest, że Shotwell 0.7 nie przechowuje swoich znaczników na zdjęciach podczas tworzenia tych znaczników, znaczniki można osadzić na zdjęciach, jeśli zdecydujesz się je wyeksportować, dzięki Adamowi za wyjaśnienie. Mamy nadzieję, że ten eksport jest bezstratny w przypadku plików JPEG. Podejrzewam, że tak, jeśli wybierzesz oryginalny rozmiar dla opcji Skalowanie w oknie dialogowym eksportu.
Szybki (brudny?) Kod Pythona, aby to zrobić bez aktualizacji Shotwell (myślę, że od wersji 0.8.x Shotwell może wypisywać tagi, ale nie możesz uaktualnić do tego w Lucid). Ta rzecz wypisze gwiazdki jako tagi (skomentuj to, oczywiście, jeśli tego nie chcesz).
Wymaga exiftool. Powielą wszystkie tagi, które są zarówno w bazie danych shotwell ORAZ obrazy (tj. Te, które Shotwell zaimportował podczas importowania obrazów), więc uważaj na to. Dużo kolekcji zdjęć zajmuje też sporo czasu.
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)
Jeśli potrzebujesz naprawdę dobrego narzędzia / przeglądarki GUI, które pozwoli Ci oznaczać zdjęcia przy użyciu tagów Exif (i dlatego też dostępne w Shotwell), polecam jBrout .
Mam napisane o jBrout na moim blogu .
Aby go zainstalować, przejdź do Synaptic, wybierz ustawienia / repozytoria, kliknij kartę „Inne oprogramowanie”, a następnie kliknij przycisk „Dodaj” i wklej w tym wierszu:
deb http://jbrout.free.fr/download/debian binary /
Następnie załaduj ponownie i wyszukaj jBrout.
Ponieważ ~/.shotwell/data/photo.db
jest identyfikowany jako photo.db: SQLite 3.x database
przez polecenie pliku, użyłem SQLite Database Browser
( sqlitebrowser
), aby go otworzyć.
Hmmm ... możesz to przeczytać :-) Posiada funkcję eksportu CVS.
To nie jest normalne podejście do GUI, ale jest na to sposób.
Próbowałem użyć skryptu użytkownika38122 do analizowania bazy danych shotwell, ale to nie zadziałało. Najwyraźniej schemat został zmieniony w ostatnich wersjach. Zamiast tego napisałem następujący skrypt, który używa pand (które osobiście wolę pisać SQL) do wykonywania przecięć znaczników. W poniższym przykładzie pokazuję wszystkie obrazy, które mają zarówno znacznik „cat”, jak i znacznik „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'