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

14

Importei muitas fotos para a Shotwell e passei algum tempo configurando tags. Essas tags estão bloqueadas na Shotwell ou posso exportá-las (e importá-las novamente ou usar com outro software)?

Ivan
fonte

Respostas:

22

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ê os exporta. Os metadados são gravados nos formatos EXIF, IPTC e / ou XMP (dependendo de qual deles estava presente na foto, para começar). A maioria dos outros programas de fotos pode ler esses formatos; portanto, se você exportar suas fotos da Shotwell, outros programas poderão ler suas tags sem nenhum problema.

O próximo Shotwell 0.8 pode gravar metadados em arquivos de fotos em tempo real - para ativar isso, selecione a opção " Gravar tags, títulos e outros metadados em arquivos de fotos " na caixa de diálogo de preferências . Uma vez selecionado, o Shotwell atualizará os metadados nos arquivos de foto assim que você os marcar. Para usar esse recurso, construa o tronco Shotwell a partir da fonte (consulte http://yorba.org/shotwell/install/#source ) ou apenas aguarde o Shotwell 0.8 (que planejamos lançar no final de dezembro).

Adam Dingle
fonte
+1 Eu sou um novo usuário do Shotwell; obrigado por todo o seu bom trabalho.
msw
3
A escrita da meta tag on the fly funciona retroativamente?
Hultqvist
@hultqvist, sim, eu verifiquei apenas a opção e Shotwell começou a escrever a todos os meus fotos depois
algum usuário
9

Infelizmente, o Shotwell parece manter as tags em seu próprio banco de dados, em vez de incorporá-las como exif, IPTC ou XMP nas fotos. 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.jpgpara verificar uma foto chamada testpicture.jpg que você havia marcado anteriormente com a Shotwell. Você verá que a saída do exiftool não contém tags Shotwell.

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

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

Substitua a lista de palavras-chave existente por duas novas palavras-chave (favorita e família).

Quando testpicture.jpg é importado para o Shotwell, a imagem será identificada como favorita e familiar.

Pode ser útil saber que o banco de dados Shotwell é um banco de dados sqlite localizado no seu; ~/.shotwell/datadiretório e geralmente chamado photo.db, você pode copiá-lo em outro lugar do 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 (valores separados por vírgulas), é possível verificar se algum 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.

Esperamos que, à medida que o Shotwell obtenha mais recursos, essa situação mude.

ATUALIZAÇÃO: Embora seja verdade que o Shotwell 0.7 não armazena suas tags nas imagens à medida que elas são criadas, elas podem ser incorporadas nas fotos se você optar por exportá-las, obrigado Adam por deixar isso claro. Esperamos que essa exportação seja sem perdas ao lidar com jpegs. Eu suspeito que sim, se alguém selecionar o tamanho original para a opção Escala na caixa de diálogo de exportação.

Sabacon
fonte
1
Durante a exportação, se a opção Escala for Tamanho original e a foto não for editada (sem ajustes de cor, corte, etc.), ela não terá perdas. Observe que alterar a orientação de uma foto também é sem perdas, pois usamos o sinalizador EXIF ​​em vez de recodificar a imagem girada.
Jim Nelson
Acredito que você pode marcar a caixa "Gravar tags, títulos e outros metadados em arquivos de fotos" nas preferências do Shetwell para que ele grave suas tags nos arquivos de imagem.
precisa
2

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

Requer exiftool. Ele duplicará todas as tags que estão no banco de dados shotwell E nas imagens (ou seja, aquelas que a Shotwell importou quando importou as imagens), portanto, tenha cuidado com 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)
user38122
fonte
0

Se você deseja uma ferramenta / navegador de interface gráfica do usuário realmente boa que permita que você marque suas imagens usando as tags Exif (e, portanto, também disponíveis na Shotwell), recomendo o jBrout .

Eu escrevi sobre o jBrout no meu blog .

Para instalá-lo, vá para Synaptic, escolha configurações / repositórios, clique na guia "Outros softwares", clique no botão "Adicionar" e cole nesta linha:

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

Em seguida, recarregue e procure pelo jBrout.

Scaine
fonte
0

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

Hmmm ... você pode ler :-) Possui o recurso de exportação do CVS.

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

Osamu Aoki
fonte
0

Tentei usar o script do user38122 para analisar o banco de dados shotwell, e não funcionou. Aparentemente, o esquema foi alterado nas 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 possuem 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'
Dov Grobgeld
fonte