Jawaban:
Saya adalah pendiri Yorba, pembuat Shotwell. Terima kasih atas pertanyaan anda
Shotwell 0.7 menulis metadata (seperti tag dan judul) ke foto saat Anda mengekspornya. Metadata ditulis dalam format EXIF, IPTC dan / atau XMP (tergantung yang mana yang ada di foto untuk memulai). Sebagian besar program foto lainnya dapat membaca format ini, jadi jika Anda mengekspor foto Anda dari Shotwell maka program lain harus dapat membaca tag mereka tanpa masalah.
Shotwell 0.8 yang akan datang dapat menulis metadata ke file foto dengan cepat - untuk mengaktifkannya, pilih opsi " Tulis tag, judul, dan metadata lain ke file foto " di dialog preferensi . Setelah ini dipilih, Shotwell akan memperbarui metadata dalam file foto segera setelah Anda menandai mereka. Untuk menggunakan fitur ini, bangun trunk Shotwell dari sumber (lihat http://yorba.org/shotwell/install/#source ), atau tunggu saja Shotwell 0.8 (yang kami rencanakan akan rilis akhir Desember).
Sayangnya, Shotwell tampaknya menyimpan tag-tag itu di basis datanya sendiri dan bukannya menyematkannya sebagai exif, IPTC, atau XMP dalam gambar. Anda dapat memeriksa dengan menggunakan exiftool, yang dapat diinstal dengan menginstal paket libimage-exiftool-perl , tersedia di repositori.
gunakan perintah; exiftool testpicture.jpg
untuk memeriksa foto bernama testpicture.jpg yang sebelumnya Anda tandai dengan Shotwell. Anda akan melihat bahwa keluaran exiftool tidak mengandung tag Shotwell.
Utilitas exiftool dapat menandai gambar Anda dengan menempelkan tag pada foto dan hal baiknya adalah bahwa sebagian besar pengelola foto akan menggunakannya, ini termasuk Shotwell. Sebagai contoh:
exiftool -keywords=favourite -keywords=family testpicture.jpg
Ganti daftar kata kunci yang ada dengan dua kata kunci baru (favorit dan keluarga).
Ketika testpicture.jpg diimpor ke Shotwell, gambar akan ditandai dengan favorit dan keluarga
Mungkin bermanfaat untuk mengetahui bahwa basis data Shotwell adalah basis data sqlite yang terletak di Anda; ~/.shotwell/data
direktori dan biasanya disebut photo.db, Anda dapat menyalinnya di tempat lain di komputer Anda dan mengaksesnya dengan sqlite.
Ada beberapa antarmuka GUI untuk sqlite, ada satu untuk firefox di sini atau Anda dapat menggunakan sqliteman . Kedua ujung depan ini memiliki fitur ekspor ke csv; ketika Anda mengekspor tag Anda ke csv (Comma Separated Values), Anda dapat memeriksa apakah ada perangkat lunak manajemen foto lain yang akan mengimpor dan memetakan tag ke bidang yang sesuai di database mereka sendiri. Saya yakin Digikam bisa melakukan ini. Digikam juga dapat menyematkan data exif di foto itu sendiri.
Semoga Shotwell mendapatkan lebih banyak fitur, situasi ini akan berubah.
UPDATE: Meskipun benar bahwa Shotwell 0.7 tidak menyimpan tag-nya dalam gambar karena tag ini dibuat, tag dapat tertanam dalam gambar jika Anda memilih untuk mengekspornya, terima kasih Adam telah menjelaskannya. Semoga ekspor ini tidak rugi ketika berhadapan dengan jpegs. Saya menduga itu adalah, jika seseorang memilih ukuran asli untuk opsi Penskalaan dalam dialog ekspor.
Kode python cepat (kotor?) Untuk melakukan ini tanpa memutakhirkan Shotwell (saya pikir pada 0.8.x Shotwell dapat menulis tag, tetapi Anda tidak dapat memutakhirkannya di Lucid). Hal ini akan menuliskan peringkat bintang sebagai tag (komentar yang menggigit, jelas, jika Anda tidak menginginkannya).
Membutuhkan exiftool. Ini akan menduplikasi tag apa pun yang ada di dalam basis data shotwell DAN gambar (yaitu yang diimpor oleh Shotwell ketika mengimpor gambar) jadi waspadalah untuk itu. Juga, perlu waktu cukup lama untuk koleksi foto yang besar.
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)
Jika Anda menginginkan alat / browser GUI yang sangat bagus yang akan memungkinkan Anda memberi tag pada gambar Anda menggunakan tag Exif (dan karenanya juga tersedia di Shotwell), saya sarankan jBrout .
Saya sudah menulis tentang jBrout di blog saya .
Untuk menginstalnya, buka Synaptic, pilih pengaturan / repositori, klik pada tab "Other Software", lalu tekan tombol "Add" dan rekatkan di baris ini:
deb http://jbrout.free.fr/download/debian binary /
Kemudian muat ulang dan cari jBrout.
Karena ~/.shotwell/data/photo.db
diidentifikasi sebagai photo.db: SQLite 3.x database
oleh perintah file, saya menggunakan SQLite Database Browser
( sqlitebrowser
) untuk membukanya.
Hmmm ... Anda dapat membacanya :-) Ini memiliki fitur ekspor CVS.
Ini bukan pendekatan GUI normal tetapi ada cara.
Saya mencoba menggunakan skrip user38122 untuk mem- parsing database shotwell, dan itu tidak berhasil. Rupanya skema telah diubah dalam versi terbaru. Sebagai gantinya saya menulis skrip berikut yang menggunakan panda (yang secara pribadi saya lebih suka menulis SQL) untuk melakukan persimpangan tag. Pada contoh di bawah ini saya menunjukkan semua gambar yang memiliki tag 'kucing' dan tag 'tidur'.
#!/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'