Antworten:
Ich bin der Gründer von Yorba, Macher von Shotwell. Danke für deine Frage.
Shotwell 0.7 schreibt Metadaten (wie Tags und Titel) in Fotos, wenn Sie diese exportieren. Die Metadaten werden im EXIF-, IPTC- und / oder XMP-Format geschrieben (je nachdem, welche davon auf dem Foto vorhanden waren). Die meisten anderen Fotoprogramme können diese Formate lesen. Wenn Sie also Ihre Fotos aus Shotwell exportieren, sollten andere Programme ihre Tags problemlos lesen können.
Das kommende Shotwell 0.8 kann Metadaten direkt in Fotodateien schreiben. Wählen Sie dazu die Option " Tags, Titel und andere Metadaten in Fotodateien schreiben " im Einstellungsdialog . Sobald dies ausgewählt ist, aktualisiert Shotwell die Metadaten in den Fotodateien, sobald Sie sie mit Tags versehen. Um diese Funktion zu nutzen, erstellen Sie den Shotwell-Trunk aus dem Quellcode (siehe http://yorba.org/shotwell/install/#source ) oder warten Sie einfach auf Shotwell 0.8 (das wir später im Dezember veröffentlichen wollen).
Leider scheint Shotwell die Tags in seiner eigenen Datenbank zu behalten, anstatt sie als exif, IPTC oder XMP in die Bilder einzubetten. Sie können dies mit Hilfe von exiftool überprüfen, das installiert werden kann, indem Sie das Paket libimage-exiftool-perl installieren , das in den Repositorys verfügbar ist.
Sehen Sie hier einige Beispiele
benutze den Befehl; exiftool testpicture.jpg
um ein Foto mit dem Namen testpicture.jpg zu überprüfen, das Sie zuvor mit Shotwell getaggt hatten. Sie werden sehen, dass die Exiftool-Ausgabe keine Shotwell-Tags enthält.
Das Dienstprogramm exiftool kann Ihre Bilder mit Tags versehen, die die Tags in das Foto einbetten, und das Gute daran ist, dass die meisten Fotomanager sie verwenden, einschließlich Shotwell. Beispielsweise:
exiftool -keywords=favourite -keywords=family testpicture.jpg
Ersetzen Sie die vorhandene Keyword-Liste durch zwei neue Keywords (Favorit und Familie).
Wenn testpicture.jpg in Shotwell importiert wird, wird das Bild mit Favorit und Familie markiert
Es kann hilfreich sein zu wissen, dass die Shotwell-Datenbank eine SQLite-Datenbank in Ihrem Verzeichnis ist. ~/.shotwell/data
Verzeichnis und normalerweise photo.db genannt, können Sie es an eine andere Stelle auf Ihrem Computer kopieren und mit sqlite darauf zugreifen.
Es gibt ein paar GUI-Frontends für SQLite, eines für Firefox oder Sie können SQLiteman verwenden . Beide Frontends verfügen über einen Export in CSV-Funktionen. Wenn Sie Ihre Tags in csv (Comma Separated Values) exportieren, können Sie überprüfen, ob eine andere Fotoverwaltungssoftware die Tags importiert und dem entsprechenden Feld in ihren eigenen Datenbanken zuordnet. Ich glaube, Digikam kann das. Digikam kann auch Exif-Daten in die Fotos selbst einbetten.
Hoffentlich ändert sich diese Situation, wenn Shotwell mehr Funktionen erhält.
AKTUALISIERUNG: Shotwell 0.7 speichert zwar seine Tags nicht in den Bildern, während diese Tags erstellt werden, aber die Tags können in die Bilder eingebettet werden, wenn Sie sie exportieren möchten. Vielen Dank, Adam, dass Sie dies klargestellt haben. Hoffentlich ist dieser Export beim Umgang mit JPEGs verlustfrei. Ich vermute es ist, wenn man im Exportdialog Originalgröße für die Skalierungsoption auswählt.
Schneller (schmutziger?) Python-Code, um dies zu tun, ohne Shotwell zu aktualisieren. Dieses Ding schreibt Sternebewertungen als Tags aus (kommentieren Sie das natürlich aus, wenn Sie das nicht wollen).
Benötigt exiftool. Es werden alle Tags dupliziert, die sich sowohl in der Shotwell-Datenbank als auch in den Bildern befinden (dh die, die Shotwell beim Import der Bilder importiert hat). Achten Sie also darauf. Außerdem dauert es eine Weile, bis eine große Sammlung von Fotos vorliegt.
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)
Wenn Sie ein wirklich gutes GUI-Tool / einen guten Browser benötigen , mit dem Sie Ihre Bilder mit Exif-Tags kennzeichnen können (und daher auch in Shotwell verfügbar sind), empfehle ich jBrout .
Ich habe in meinem Blog über jBrout geschrieben .
Um es zu installieren, gehen Sie zu Synaptic, wählen Sie Einstellungen / Repositorys, klicken Sie auf die Registerkarte "Andere Software", klicken Sie dann auf die Schaltfläche "Hinzufügen" und fügen Sie in diese Zeile ein:
deb http://jbrout.free.fr/download/debian binary /
Dann neu laden und nach jBrout suchen.
Da ~/.shotwell/data/photo.db
es sich photo.db: SQLite 3.x database
um einen Dateibefehl handelt, habe ich es mit SQLite Database Browser
( sqlitebrowser
) geöffnet.
Hmmm ... Sie können es lesen :-) Es hat CVS-Export-Funktion.
Dies ist kein normaler GUI-Ansatz, aber es gibt einen Weg.
Ich habe versucht, das Skript von user38122 zum Parsen der Shotwell-Datenbank zu verwenden, aber es hat nicht funktioniert. Anscheinend wurde das Schema in den letzten Versionen geändert. Stattdessen habe ich das folgende Skript geschrieben, das Pandas (die ich persönlich lieber als SQL schreibe) verwendet, um Tag-Schnittmengen zu erstellen. Im folgenden Beispiel zeige ich alle Bilder, die sowohl das Tag 'cat' als auch das Tag 'sleeping' haben.
#!/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'