Posso exportar o banco de dados de fotos da Shotwell salvando todas as tags?

14

Eu importei muitas fotos para o Shotwell e passei algum tempo definindo tags. Essas tags estão bloqueadas no Shotwell ou posso exportá-las (e importar novamente ou usar com outro software)?

    
por Ivan 19.12.2010 / 03:49

6 respostas

22

Eu sou o fundador da Yorba, criadora da Shotwell. Obrigado pela sua pergunta.

O Shotwell 0.7 grava metadados (como tags e títulos) em fotos quando você as exporta. Os metadados são escritos em formato EXIF, IPTC e / ou XMP (dependendo de qual deles estava presente na foto para começar). A maioria dos outros programas de fotografia pode ler esses formatos, portanto, se você exportar suas fotos do Shotwell, outros programas poderão ler suas tags sem problemas.

O próximo Shotwell 0.8 pode gravar metadados em arquivos de fotos em tempo real - para habilitar isso, selecione a opção " Escrever tags, títulos e outros metadados para arquivos de fotos " no diálogo de preferências . Uma vez selecionado, a Shotwell atualizará os metadados em arquivos de fotos assim que você os marcar. Para usar este recurso, crie o tronco Shotwell a partir da fonte (veja link ), ou apenas espere o Shotwell 0.8 (que nós planeja lançar no final de dezembro).

    
por Adam Dingle 21.12.2010 / 20:19
9

Infelizmente, a Shotwell parece manter as tags em seu próprio banco de dados, em vez de incorporá-las como exif, IPTC ou XMP nas imagens. Você pode verificar usando o exiftool, que pode ser instalado instalando o pacote libimage-exiftool-perl , disponível nos repositórios.

Veja alguns exemplos aqui

use o comando; exiftool testpicture.jpg para checar uma foto chamada testpicture.jpg que você tinha previamente marcado com Shotwell. Você verá que a saída exiftool não contém tags Shotwell.

O utilitário exiftool pode marcar suas imagens incorporando as tags na foto e o bom disso é que a maioria dos gerentes de fotos as usará, incluindo a Shotwell. Por exemplo:

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

Substitua a lista de palavras-chave existentes por duas novas palavras-chave (favorito e familiar).

Quando o testpicture.jpg é importado para o Shotwell, a imagem será marcada com o favorito e a família

Pode ser útil saber que o banco de dados Shotwell é um banco de dados sqlite localizado no seu; ~/.shotwell/data e geralmente chamado de photo.db, você pode copiá-lo em outro lugar no seu computador e acessá-lo com o sqlite.

Existem algumas interfaces gráficas para o sqlite, existe uma para o firefox aqui ou você pode usar o sqliteman . Ambos os front-ends têm exportação para recursos csv; Ao exportar suas tags para csv (Comma Separated Values), você pode verificar se qualquer outro software de gerenciamento de fotos importará e mapeará as tags para o campo apropriado em seus próprios bancos de dados. Eu acredito que o Digikam pode fazer isso. O Digikam também pode incorporar dados exif nas próprias fotos.

Espero que, com o Shotwell ganhando mais recursos, essa situação mude.

ATUALIZAÇÃO: Embora seja verdade que o Shotwell 0.7 não armazene suas tags nas imagens enquanto essas tags são criadas, as tags podem ser incorporadas nas imagens se você optar por exportá-las, obrigado Adam por deixar isso claro. Esperemos que esta exportação seja sem perdas quando se trata de jpegs. Eu suspeito que é, se alguém seleciona o tamanho original para a opção Scaling na caixa de diálogo de exportação.

    
por Sabacon 19.12.2010 / 05:25
2

Código python rápido (sujo?) para fazer isso sem atualizar o Shotwell (acho que a 0.8.x Shotwell pode gravar tags, mas você não pode atualizar para isso no Lucid). Essa coisa vai escrever classificações de estrelas como tags (comente que, obviamente, você não quer isso).

Requer exiftool. Ele duplicará as tags que estão no banco de dados shotwell E nas imagens (ou seja, aquelas que Shotwell importou quando importou as imagens), então fique atento a isso. Além disso, leva um bom tempo para uma grande coleção 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)
    
por user38122 16.12.2011 / 07:14
0

Se você quiser uma ferramenta GUI / browser realmente boa que permita marcar suas imagens usando tags Exif (e, portanto, também disponível na Shotwell), eu recomendo jBrout .

Eu tenho escrito sobre jBrout no meu blog .

Para instalá-lo, acesse o Synaptic, escolha settings / repositories, clique na aba "Other Software", clique no botão "Add" e cole nesta linha:

  

deb link binário /

Em seguida, recarregue e pesquise por jBrout.

    
por Scaine 19.12.2010 / 23:34
0

Como ~/.shotwell/data/photo.db é identificado como photo.db: SQLite 3.x database pelo comando file, usei SQLite Database Browser ( sqlitebrowser ) para abri-lo.

Hmmm ... você pode lê-lo :-) Ele tem recurso de exportação CVS.

Esta não é uma abordagem normal da GUI, mas existe uma maneira.

    
por Osamu Aoki 01.10.2011 / 15:45
0

Eu tentei usar o script do user38122 para analisar o banco de dados shotwell, e ele não funcionou. Aparentemente, o esquema foi alterado em versões recentes. Em vez disso, escrevi o seguinte script que usa pandas (que eu pessoalmente prefiro escrever SQL) para fazer interseções de tags. No exemplo abaixo, mostro todas as imagens que têm a tag 'cat' e a tag 'sleeping'.

#!/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'
    
por Dov Grobgeld 24.08.2014 / 21:54

Tags