it-swarm.com.de

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

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

14
Ivan

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.

Die 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 veröffentlichen möchten) Dezember).

22
Adam Dingle

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 durch Installation des Pakets libimage-exiftool-Perl installiert werden kann, das in den Repositorys verfügbar ist.

Siehe einige Beispiele hier

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 Hilfsprogramm 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. Zum Beispiel:

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

9
Sabacon

Schneller (schmutziger?) python Code, um dies zu tun, ohne Shotwell zu aktualisieren (ich denke, ab 0.8.x kann Shotwell Tags ausschreiben, aber auf Lucid können Sie nicht darauf 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)
2
user38122

Wenn Sie ein wirklich gutes GUI-Tool/einen guten Browser suchen, mit dem Sie Ihre Bilder mit Exif-Tags kennzeichnen können (und daher auch in Shotwell verfügbar sind), empfehle ich jBrout .

Ich habe über jBrout in meinem Blog geschrieben .

Um es zu installieren, gehen Sie zu Synaptic, wählen Sie Einstellungen/Repositories, klicken Sie auf die Registerkarte "Andere Software", klicken Sie auf die Schaltfläche "Hinzufügen" und fügen Sie in dieser Zeile:

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

Dann neu laden und nach jBrout suchen.

0
Scaine

Da ~/.shotwell/data/photo.db durch den Dateibefehl als photo.db: SQLite 3.x database identifiziert wird, habe ich SQLite Database Browser (sqlitebrowser) verwendet, um es zu öffnen.

Hmmm ... Sie können es lesen :-) Es hat CVS-Export-Funktion.

Dies ist kein normaler GUI-Ansatz, aber es gibt einen Weg.

0
Osamu Aoki

Ich habe versucht, ser38122s Skript 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 (das ich persönlich lieber als SQL schreibe) verwendet, um Tag-Schnittmengen zu erstellen. Im folgenden Beispiel zeige ich alle Bilder, die sowohl den Tag 'cat' als auch den 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'
0
Dov Grobgeld