Respostas:
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).
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.
use o comando; exiftool testpicture.jpg
para 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/data
diretó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.
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)
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.
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 ler :-) Possui o recurso de exportação do CVS.
Esta não é uma abordagem GUI normal, mas existe uma maneira.
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'