Kann ich die Shotwell-Bilddatenbank exportieren und alle Tags speichern?

14

Ich habe viele Bilder in Shotwell importiert und einige Zeit damit verbracht, Tags zu setzen. Sind diese Tags in Shotwell gesperrt oder kann ich sie exportieren (und erneut importieren oder mit anderer Software verwenden)?

Ivan
quelle

Antworten:

22

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).

Adam Dingle
quelle
+1 Ich bin ein neuer Benutzer von Shotwell. Vielen Dank für all Ihre gute Arbeit.
msw
3
Funktioniert das direkte Schreiben von Metatags rückwirkend?
hultqvist
@hultqvist, ja, ich habe gerade die Option ausgewählt und shotwell hat dann damit begonnen, sie auf alle meine Fotos zu schreiben
einige User vom
9

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.jpgum 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/dataVerzeichnis 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.

Sabacon
quelle
1
Wenn beim Export die Option Skalierung auf Originalgröße eingestellt ist und das Foto unbearbeitet ist (keine Farbanpassungen, Zuschneiden usw.), ist es verlustfrei. Beachten Sie, dass das Ändern der Ausrichtung eines Fotos ebenfalls verlustfrei ist, da wir das EXIF-Flag verwenden, anstatt das gedrehte Bild neu zu codieren.
Jim Nelson
Ich glaube, Sie können das Kontrollkästchen "Tags, Titel und andere Metadaten in Fotodateien schreiben" in den Shetwell-Einstellungen aktivieren, damit die Tags in die Bilddateien geschrieben werden.
JellicleCat
2

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)
user38122
quelle
0

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.

Scaine
quelle
0

Da ~/.shotwell/data/photo.dbes sich photo.db: SQLite 3.x databaseum 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.

Osamu Aoki
quelle
0

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'
Dov Grobgeld
quelle