Bisakah saya mengekspor basis data gambar Shotwell menyimpan semua tag?

14

Saya telah mengimpor banyak gambar ke Shotwell dan menghabiskan waktu untuk mengatur tag. Apakah tag-tag itu terkunci di dalam Shotwell atau saya dapat mengekspornya (dan mengimpor lagi atau menggunakan perangkat lunak lain)?

Ivan
sumber

Jawaban:

22

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).

Adam Dingle
sumber
+1 Saya adalah pengguna baru Shotwell; terima kasih untuk semua kerja bagusmu.
msw
3
Apakah penulisan tag meta on the fly berfungsi surut?
hultqvist
@hultqvist, ya, saya baru saja memeriksa opsi dan shotwell mulai menulisnya ke semua foto saya setelah itu
beberapa pengguna
9

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.

Lihat beberapa contoh di sini

gunakan perintah; exiftool testpicture.jpguntuk 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/datadirektori 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.

Sabacon
sumber
1
Selama ekspor jika opsi Penskalaan adalah Ukuran Asli dan foto tersebut belum diedit (tidak ada penyesuaian warna, krop, dll.), Ini tidak rugi. Perhatikan bahwa mengubah orientasi foto juga tidak ada ruginya, karena kami menggunakan bendera EXIF ​​daripada menyandikan ulang gambar yang diputar.
Jim Nelson
Saya yakin Anda dapat mencentang kotak "Tulis tag, judul, dan metadata lain ke file foto" di preferensi Shetwell untuk membuatnya menulis tagnya ke file gambar.
JellicleCat
2

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)
pengguna38122
sumber
0

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.

Scaine
sumber
0

Karena ~/.shotwell/data/photo.dbdiidentifikasi sebagai photo.db: SQLite 3.x databaseoleh 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.

Osamu Aoki
sumber
0

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'
Dov Grobgeld
sumber