¿Puedo exportar la base de datos de imágenes Shotwell guardando todas las etiquetas?

14

Importé muchas fotos en Shotwell y pasé algún tiempo configurando etiquetas. ¿Están esas etiquetas bloqueadas en Shotwell o puedo exportarlas (e importar de nuevo o usar con otro software)?

Ivan
fuente

Respuestas:

22

Soy el fundador de Yorba, creadores de Shotwell. Gracias por tu pregunta

Shotwell 0.7 escribe metadatos (como etiquetas y títulos) en las fotos cuando las exporta. Los metadatos están escritos en formato EXIF, IPTC y / o XMP (dependiendo de cuál de ellos estaba presente en la foto para empezar). La mayoría de los otros programas de fotos pueden leer estos formatos, por lo que si exporta sus fotos desde Shotwell, otros programas deberían poder leer sus etiquetas sin ningún problema.

El próximo Shotwell 0.8 puede escribir metadatos en archivos de fotos sobre la marcha. Para habilitar esto, seleccione la opción " Escribir etiquetas, títulos y otros metadatos en archivos de fotos " en el diálogo de preferencias . Una vez que se selecciona esto, Shotwell actualizará los metadatos en los archivos de fotos tan pronto como los etiquete. Para usar esta función, cree el enlace troncal Shotwell desde la fuente (consulte http://yorba.org/shotwell/install/#source ), o simplemente espere a Shotwell 0.8 (que planeamos lanzar más adelante en diciembre).

Adam Dingle
fuente
+1 Soy un nuevo usuario de Shotwell; Gracias por todo su buen trabajo.
msw
3
¿La escritura de metaetiquetas sobre la marcha funciona retroactivamente?
hultqvist
@hultqvist, sí, acabo de marcar la opción y shotwell comenzó a escribirla en todas mis fotos después
algunos usuarios el
9

Desafortunadamente, Shotwell parece mantener las etiquetas en su propia base de datos en lugar de incrustarlas como exif, IPTC o XMP en las imágenes. Puede verificar usando exiftool, que puede instalarse instalando el paquete libimage-exiftool-perl , disponible en los repositorios.

Vea algunos ejemplos aquí.

usa el comando; exiftool testpicture.jpgpara ver una foto llamada testpicture.jpg que previamente etiquetaste con Shotwell. Verá que la salida de exiftool no contiene etiquetas Shotwell.

La utilidad exiftool puede etiquetar sus imágenes incrustando las etiquetas en la foto y lo bueno de esto es que la mayoría de los administradores de fotos las usarán, esto incluye Shotwell. Por ejemplo:

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

Reemplace la lista de palabras clave existentes con dos palabras clave nuevas (favorita y familiar).

Cuando testpicture.jpg se importe en Shotwell, la imagen se etiquetará con favoritos y familiares

Puede ser útil saber que la base de datos Shotwell es una base de datos sqlite ubicada en su; ~/.shotwell/datay generalmente llamado photo.db, puede copiarlo en otro lugar de su computadora y acceder a él con sqlite.

Hay algunas interfaces de interfaz gráfica de usuario para sqlite, aquí hay una para firefox o puede usar sqliteman . Ambos frontales tienen características de exportación a csv; cuando exporta sus etiquetas a csv (valores separados por comas) puede verificar si algún otro software de administración de fotografías importará y asignará las etiquetas al campo apropiado en sus propias bases de datos. Creo que Digikam puede hacer esto. Digikam también puede incrustar datos exif en las propias fotos.

Con suerte, a medida que Shotwell gane más funciones, esta situación cambiará.

ACTUALIZACIÓN: Si bien es cierto que Shotwell 0.7 no almacena sus etiquetas en las imágenes a medida que se crean, las etiquetas pueden incrustarse en las imágenes si elige exportarlas, gracias Adam por dejar esto en claro. Esperemos que esta exportación no tenga pérdidas cuando se trata de archivos JPEG. Sospecho que sí, si se selecciona el tamaño original para la opción Escala en el cuadro de diálogo de exportación.

Sabacon
fuente
1
Durante la exportación, si la opción Escala es Tamaño original y la foto no está editada (sin ajustes de color, recorte, etc.), no tiene pérdidas. Tenga en cuenta que cambiar la orientación de una foto también es sin pérdidas, ya que usamos el indicador EXIF ​​en lugar de volver a codificar la imagen girada.
Jim Nelson
Creo que puede marcar la casilla "Escribir etiquetas, títulos y otros metadatos en archivos de fotos" en las preferencias de Shetwell para que escriba sus etiquetas en los archivos de imagen.
JellicleCat
2

Código Python rápido (¿sucio?) Para hacer esto sin actualizar Shotwell (creo que a partir de 0.8.x Shotwell puede escribir etiquetas, pero no se puede actualizar a eso en Lucid). Esto escribirá las clasificaciones de estrellas como etiquetas (comente eso, obviamente, si no quiere eso).

Requiere exiftool. Duplicará cualquier etiqueta que esté en la base de datos de shotwell Y las imágenes (es decir, las que importó Shotwell cuando importó las imágenes), así que ten cuidado con eso. Además, lleva bastante tiempo para una gran colección de fotos.

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)
usuario38122
fuente
0

Si desea una herramienta / navegador GUI realmente buena que le permita etiquetar sus imágenes usando etiquetas Exif (y, por lo tanto, también disponible en Shotwell), le recomiendo jBrout .

He escrito sobre jBrout en mi blog .

Para instalarlo, vaya a Synaptic, elija configuraciones / repositorios, haga clic en la pestaña "Otro software", luego presione el botón "Agregar" y pegue en esta línea:

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

Luego vuelva a cargar y busque jBrout.

Scaine
fuente
0

Como ~/.shotwell/data/photo.dbse identifica como photo.db: SQLite 3.x databasepor comando de archivo, usé SQLite Database Browser( sqlitebrowser) para abrirlo.

Hmmm ... puedes leerlo :-) Tiene la función de exportación CVS.

Este no es un enfoque GUI normal, pero hay una manera.

Osamu Aoki
fuente
0

Intenté usar el script user38122 para analizar la base de datos shotwell, y no funcionó. Aparentemente, el esquema ha sido cambiado en versiones recientes. En cambio, escribí el siguiente script que usa pandas (que personalmente prefiero escribir SQL) para hacer intersecciones de etiquetas. En el siguiente ejemplo, muestro todas las imágenes que tienen tanto la etiqueta 'gato' como la etiqueta 'durmiendo'.

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