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


14

J'ai importé beaucoup de photos dans Shotwell et passé du temps à définir des balises. Ces balises sont-elles verrouillées dans Shotwell ou je peux les exporter (et les réimporter ou les utiliser avec d'autres logiciels)?

Réponses:


22

Je suis le fondateur de Yorba, créateur de Shotwell. Merci pour ta question.

Shotwell 0.7 écrit des métadonnées (telles que des balises et des titres) sur les photos lorsque vous les exportez. Les métadonnées sont écrites au format EXIF, IPTC et / ou XMP (en fonction de celles qui étaient présentes sur la photo pour commencer). La plupart des autres programmes photo peuvent lire ces formats, donc si vous exportez vos photos depuis Shotwell, les autres programmes devraient pouvoir lire leurs tags 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 la boîte de dialogue des préférences . Une fois cette option sélectionnée, Shotwell mettra à jour les métadonnées dans les fichiers photo dès que vous les marquerez. Pour utiliser cette fonctionnalité, créez le tronc Shotwell à partir des sources (voir http://yorba.org/shotwell/install/#source ), ou attendez simplement Shotwell 0.8 (que nous prévoyons de publier plus tard en décembre).


+1 Je suis un nouvel utilisateur de Shotwell; merci pour tout votre beau travail.
msw

3
L'écriture de la balise META on the fly fonctionne-t-elle rétroactivement?
hultqvist

@hultqvist, oui, je viens de vérifier l'option et Shotwell a commencé à l'écrire sur toutes mes photos par la suite
un utilisateur du

9

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

Voir quelques exemples ici

utilisez la commande; exiftool testpicture.jpgpour vérifier une photo appelée testpicture.jpg que vous aviez précédemment taguée avec Shotwell. Vous verrez que la sortie exiftool ne contient aucune balise Shotwell.

L'utilitaire exiftool peut marquer vos photos en incorporant les balises dans la photo et la bonne chose à ce sujet 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, l'image sera 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/dataet 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 ici ou vous pouvez utiliser sqliteman . Ces deux frontaux ont des fonctions d'exportation vers csv; lorsque vous exportez vos balises vers csv (Comma Separated Values), vous pouvez vérifier si un autre logiciel de gestion de photos importera et mappera les balises vers le champ approprié dans leurs propres bases de données. Je crois que Digikam peut le faire. Digikam peut également intégrer des données exif dans les photos elles-mêmes.

Avec un peu de chance, à mesure que Shotwell gagne en fonctionnalités, cette situation va changer.

MISE À JOUR: S'il est vrai que Shotwell 0.7 ne stocke pas ses balises dans les images au fur et à mesure que ces balises sont créées, les balises peuvent être incorporées dans les images si vous choisissez de les exporter, merci Adam d'avoir précisé cela. Espérons que cette exportation soit sans perte lorsqu'il s'agit de fichiers JPEG. Je soupçonne que c'est le cas, si l'on sélectionne la taille d'origine pour l'option Mise à l'échelle dans la boîte de dialogue d'exportation.


1
Lors de l'exportation, si l'option Mise à l'échelle est Taille originale et que la photo n'est pas éditée (aucun ajustement des couleurs, recadrage, etc.), elle est sans perte. Notez que la modification de l'orientation d'une photo est également sans perte, car nous utilisons le drapeau EXIF ​​plutôt que de ré-encoder l'image pivotée.
Jim Nelson

Je pense que vous pouvez cocher la case "Écrire des balises, des titres et d'autres métadonnées dans des fichiers photo" dans les préférences de Shetwell pour qu'il écrive ses balises dans les fichiers image.
JellicleCat

2

Code python rapide (sale?) Pour faire cela sans mettre à jour Shotwell (je pense qu'à partir de 0.8.x Shotwell peut écrire des balises, mais vous ne pouvez pas passer à cela sur Lucid). Cette chose écrira les étoiles sous forme de balises (commentaire qui mord, évidemment, si vous ne le voulez pas).

Nécessite exiftool. Il dupliquera toutes les balises qui sont à 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)

0

Si vous voulez un très bon outil / navigateur GUI qui vous permettra de marquer vos images à l'aide de balises Exif (et donc également disponibles dans Shotwell), je recommande jBrout .

J'ai écrit sur jBrout sur mon blog .

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

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

Rechargez ensuite et recherchez jBrout.


0

Puisque ~/.shotwell/data/photo.dbest identifié photo.db: SQLite 3.x databasepar la commande file, j'ai utilisé SQLite Database Browser(sqlitebrowser ) pour l'ouvrir.

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

Ce n'est pas une approche GUI normale mais il existe un moyen.


0

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 des pandas (que je préfère personnellement écrire SQL) pour faire des intersections de balises. Dans l'exemple ci-dessous, je montre toutes les images qui ont à la fois la balise 'cat' et la balise '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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.