Pertanyaan Bisakah saya mengekspor database gambar Shotwell menyimpan semua tag?


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


14
2017-12-19 02:49


asal




Jawaban:


Saya adalah pendiri Yorba, pembuat Shotwell. Terima kasih atas pertanyaanmu.

Shotwell 0.7 menulis metadata (seperti tag dan judul) ke foto saat Anda mengekspornya. Metadata ditulis dalam format EXIF, IPTC dan / atau XMP (tergantung dari 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 mengaktifkan ini, pilih opsi "Tuliskan tag, judul dan metadata lainnya ke file foto"dalam dialog preferensi. Setelah ini dipilih, Shotwell akan memperbarui metadata dalam file foto segera setelah Anda memberi tag mereka. Untuk menggunakan fitur ini, buat batang Shotwell dari sumber (lihat http://yorba.org/shotwell/install/#source), atau tunggu saja Shotwell 0.8 (yang akan kami rencanakan nanti pada bulan Desember).


22
2017-12-21 19:19



+1 Saya pengguna baru Shotwell; terima kasih untuk semua pekerjaan baik Anda. - msw
Apakah penulisan meta tag on the fly berlaku surut? - hultqvist
@hultqvist, ya, saya baru saja memeriksa opsi dan shotwell mulai menulisnya ke semua foto saya sesudahnya - some user


Sayangnya Shotwell tampaknya menyimpan tag dalam basisdirinya sendiri daripada 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.jpg untuk memeriksa foto yang disebut testpicture.jpg yang sebelumnya telah Anda tandai dengan Shotwell. Anda akan melihat bahwa keluaran exiftool tidak mengandung tag Shotwell.

Utilitas Exiftool dapat menandai gambar Anda yang melekatkan tag di foto dan hal yang baik tentang ini 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 berguna untuk mengetahui bahwa database Shotwell adalah database sqlite yang ada 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 frontend GUI untuk sqlite, ada satu untuk firefox di sini atau Anda bisa menggunakannya sqliteman. Kedua ujung depan ini memiliki fitur ekspor ke csv; ketika Anda mengekspor tag Anda ke csv (Comma Separated Values) Anda dapat memeriksa apakah perangkat lunak manajemen foto lainnya akan mengimpor dan memetakan tag ke bidang yang sesuai dalam basis data mereka sendiri. Saya yakin Digikam dapat melakukan ini. Digikam juga dapat menanamkan data exif di foto itu sendiri.

Mudah-mudahan seperti Shotwell mendapatkan lebih banyak fitur, situasi ini akan berubah.

PEMBARUAN: Meskipun benar bahwa Shotwell 0.7 tidak menyimpan tag-tagnya dalam gambar karena tag ini dibuat, tag dapat disematkan dalam gambar jika Anda memilih untuk mengekspornya, terima kasih Adam untuk menjadikan ini jelas. Semoga ekspor ini tidak hilang ketika berhadapan dengan jpegs. Saya menduga itu adalah, jika seseorang memilih ukuran asli untuk opsi Penskalaan dalam dialog ekspor.


9
2017-12-19 04:25



Selama ekspor jika opsi Penskalaan adalah Ukuran Asli dan foto tidak diedit (tidak ada penyesuaian warna, crop, dll.), tidak ada lossless. Perhatikan bahwa mengubah orientasi foto juga tidak memiliki loss, karena kami menggunakan bendera EXIF ​​daripada mengkodekan ulang gambar yang diputar. - Jim Nelson
Senang mengetahui, terima kasih - Sabacon
Saya yakin Anda dapat memeriksa kotak "Tulis tag, judul, dan metadata lain ke file foto" dalam preferensi Shetwell agar ia menulis tag-tagnya ke file gambar. - JellicleCat


Cepat (kotor?) Kode python untuk melakukan ini tanpa meng-upgrade Shotwell (saya pikir pada 0.8.x Shotwell dapat menulis tag, tetapi Anda tidak bisa meng-upgrade ke itu di Lucid). Hal ini akan menuliskan peringkat bintang sebagai tag (komentar yang sedikit keluar, tentu saja, jika Anda tidak menginginkannya).

Membutuhkan exiftool. Ini akan menduplikasi tag apa saja yang ada di database shotwell DAN gambar (yaitu yang Shotwell impor ketika mengimpor gambar) jadi hati-hati untuk itu. Juga, membutuhkan waktu cukup lama untuk koleksi foto yang banyak.

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)

2
2017-12-16 06:14





Jika Anda menginginkan alat / peramban GUI yang sangat bagus yang akan memungkinkan Anda menandai gambar Anda menggunakan tag Exif (dan karena itu tersedia di Shotwell juga), saya merekomendasikan jBrout.

Saya sudah ditulis tentang jBrout di blog saya.

Untuk menginstalnya, buka Synaptic, pilih pengaturan / repositori, klik pada tab "Perangkat Lunak Lain", lalu tekan tombol "Tambah" dan tempelkan di baris ini:

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

Kemudian kembali dan cari jBrout.


0
2017-12-19 22:34





Sejak ~/.shotwell/data/photo.db diidentifikasi sebagai photo.db: SQLite 3.x database oleh perintah file, saya gunakan SQLite Database Browser (sqlitebrowser) untuk membukanya.

Hmmm ... Anda bisa membacanya :-) Ini memiliki fitur ekspor CVS.

Ini bukan pendekatan GUI yang normal tetapi ada jalan.


0
2017-10-01 13:45





Saya mencoba menggunakan skrip user38122 untuk mem-parsing database shotwell, dan itu tidak berhasil. Rupanya skema telah diubah dalam versi terbaru. Sebaliknya saya menulis skrip berikut yang menggunakan panda (yang saya pribadi lebih suka menulis SQL) untuk melakukan persimpangan tag. Dalam 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'

0
2017-08-24 19:54