web-dev-qa-db-fra.com

Puis-je exporter la base de données d'images Shotwell en sauvegardant tous les tags?

J'ai importé de nombreuses photos dans Shotwell et passé du temps à définir des balises. Ces balises sont-elles bloquées dans Shotwell ou puis-je les exporter (et les importer à nouveau ou les utiliser avec un autre logiciel)?

14
Ivan

Je suis le fondateur de Yorba, fabricant de Shotwell. Merci pour votre question.

Shotwell 0.7 écrit des métadonnées (telles que des balises et des titres) sur des photos lorsque vous les exportez. Les métadonnées sont écrites au format EXIF, IPTC et/ou XMP (en fonction de ceux qui étaient présents dans la photo pour commencer). La plupart des autres programmes photo peuvent lire ces formats. Par conséquent, si vous exportez vos photos depuis Shotwell, les autres programmes devraient pouvoir lire leurs balises sans problème.

Le prochain Shotwell 0.8 peut écrire des métadonnées dans des fichiers photo à la volée - pour l'activer, sélectionnez l'option " Écrire des balises, des titres et d'autres métadonnées dans des fichiers photo "dans le dialogue de préférences . Une fois cette option sélectionnée, Shotwell mettra à jour les métadonnées des fichiers photo dès que vous les taguerez. Pour utiliser cette fonctionnalité, construisez le tronc Shotwell à partir du code source (voir http://yorba.org/shotwell/install/#source ), ou attendez simplement Shotwell 0.8 (que nous prévoyons de publier plus tard dans Décembre).

22
Adam Dingle

Malheureusement, Shotwell semble conserver les balises dans sa propre base de données plutôt que de les incorporer sous les noms exif, IPTC ou XMP dans les images. Vous pouvez vérifier en utilisant exiftool, qui peut être installé en installant le paquet libimage-exiftool-Perl , disponible dans les référentiels.

Voir quelques exemples ici

utilisez la commande; exiftool testpicture.jpg pour vérifier une photo appelée testpicture.jpg que vous aviez précédemment marquée avec Shotwell. Vous verrez que la sortie exiftool ne contient pas de balises Shotwell.

L'utilitaire exiftool peut baliser vos images en les incorporant à la photo. L'avantage, c'est que la plupart des gestionnaires de photos les utiliseront, y compris Shotwell. Par exemple:

exiftool -keywords=favourite -keywords=family testpicture.jpg

Remplacez la liste de mots clés existante par deux nouveaux mots clés (favori et famille).

Lorsque testpicture.jpg est importé dans Shotwell, la photo est marquée avec favori et famille.

Il peut être utile de savoir que la base de données Shotwell est une base de données sqlite située dans votre; ~/.shotwell/data et généralement appelé photo.db, vous pouvez le copier ailleurs sur votre ordinateur et y accéder avec sqlite.

Il y a quelques interfaces graphiques pour sqlite, il y en a une pour firefox here ou vous pouvez utiliser sqliteman . Ces deux interfaces frontales sont exportées vers des fonctionnalités CSV; Lorsque vous exportez vos tags au format CSV (valeurs séparées par des virgules), vous pouvez vérifier si un autre logiciel de gestion de photos va importer et mapper les tags dans le champ approprié de leurs propres bases de données. Je crois que Digikam peut le faire. Digikam peut également intégrer des données exif aux photos elles-mêmes.

Espérons que Shotwell gagne plus de fonctionnalités, cette situation va changer.

MISE À JOUR: S'il est vrai que Shotwell 0.7 ne stocke pas ses balises dans les images lors de la création de ces balises, les balises peuvent être incorporées dans les images si vous choisissez de les exporter, merci à Adam de l'avoir précisé. J'espère que cette exportation est sans perte lorsqu'il s'agit de fichiers JPEG. Je suppose que oui, si l’on choisit la taille originale pour l’option Mise à l’échelle de la boîte de dialogue d’exportation.

9
Sabacon

Rapide (sale?) python code pour le faire sans mettre à jour Shotwell (à partir de la version 0.8.x, Shotwell peut écrire des tags, mais vous ne pouvez pas le mettre à niveau sur Lucid). Cette chose écrira les cotes d'étoiles sous forme de balises (c'est un commentaire qui est évidemment insensé si vous ne le souhaitez pas).

Nécessite exiftool. Il dupliquera toutes les balises qui se trouvent à la fois dans la base de données Shotwell ET les images (c'est-à-dire celles que Shotwell a importées lors de l'importation des images), alors faites attention à cela. En outre, cela prend un certain temps pour une grande collection de photos.

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

Si vous voulez un très bon outil graphique/navigateur qui vous permettra de marquer vos images avec des tags Exif (et donc disponibles dans Shotwell aussi), je recommande jBrout .

J'ai écrit à propos de jBrout sur mon blog .

Pour l'installer, allez sur Synaptic, choisissez paramètres/référentiels, cliquez sur l'onglet "Autres logiciels", puis cliquez sur le bouton "Ajouter" et collez-le dans cette ligne:

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

Rechargez ensuite et recherchez jBrout.

0
Scaine

Puisque ~/.shotwell/data/photo.db est identifié comme photo.db: SQLite 3.x database par la commande de fichier, j'ai utilisé SQLite Database Browser (sqlitebrowser) pour l'ouvrir.

Hmmm ... vous pouvez le lire :-) Il a une fonctionnalité d'exportation CVS.

Ce n’est pas une approche graphique normale, mais il existe un moyen.

0
Osamu Aoki

J'ai essayé d'utiliser le script de user38122 pour analyser la base de données Shotwell, et cela n'a pas fonctionné. Apparemment, le schéma a été modifié dans les versions récentes. Au lieu de cela, j'ai écrit le script suivant qui utilise pandas (que je préfère personnellement écrire en SQL) pour faire des intersections de balises. Dans l'exemple ci-dessous, je montre toutes les images qui ont à la fois le tag 'chat' et le tag 'dormir'.

#!/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