Tüm etiketleri kaydederek Shotwell resim veritabanını dışa aktarabilir miyim?


14

Shotwell'e birçok resim aktardım ve etiketleri ayarlamak için biraz zaman harcadım. Bu etiketler Shotwell'de kilitli mi yoksa bunları dışa aktarabilir miyim (ve tekrar içe aktarabilir veya başka bir yazılımla kullanabilir miyim)?

Yanıtlar:


22

Shotwell'in kurucuları Yorba'nın kurucusuyum. Sorunuz için teşekkürler.

Shotwell 0.7, dışa aktardığınızda fotoğraflara meta veriler (etiketler ve başlıklar gibi) yazar. Meta veriler EXIF, IPTC ve / veya XMP formatında yazılır (bunlardan hangisinin başlayacağına bağlı olarak). Diğer birçok fotoğraf programı bu formatları okuyabilir, bu nedenle fotoğraflarınızı Shotwell'den dışa aktarırsanız, diğer programların etiketlerini sorunsuz bir şekilde okuyabilmesi gerekir.

Yaklaşan Shotwell 0.8, fotoğraf dosyalarına anında meta veri yazabilir - bunu etkinleştirmek için tercihler iletişim kutusunda " Fotoğraf dosyalarına etiket, başlık ve diğer meta verileri yaz " seçeneğini belirleyin . Bu seçildikten sonra Shotwell, fotoğraf dosyalarındaki meta verileri etiketlediğiniz anda günceller. Bu özelliği kullanmak için Shotwell gövdesini kaynaktan oluşturun (bkz. Http://yorba.org/shotwell/install/#source ) veya sadece Shotwell 0.8'i (Aralık ayında daha sonra yayınlamayı planlıyoruz) bekleyin.


+1 Shotwell'in yeni kullanıcısıyım; tüm iyi çalışmalarınız için teşekkürler.
msw

3
Anında meta etiket yazma geriye dönük çalışıyor mu?
hultqvist

@hultqvist, evet, sadece seçeneği kontrol ettim ve shotwell daha sonra tüm fotoğraflarıma yazmaya başladı
bazı kullanıcılar

9

Ne yazık ki Shotwell, etiketleri resimlere exif, IPTC veya XMP olarak yerleştirmek yerine kendi veritabanında tutuyor gibi görünüyor. Depolarda bulunan libimage-exiftool-perl paketini kurarak kurulabilen exiftool kullanarak kontrol edebilirsiniz .

Burada bazı örneklere bakın

komutu kullanın; exiftool testpicture.jpgdaha önce Shotwell ile etiketlediğiniz testpicture.jpg adlı fotoğrafı kontrol etmek için. Exiftool çıktısının Shotwell etiketi içermediğini göreceksiniz.

Exiftool yardımcı programı, fotoğraflarınızı etiketleri gömerek resimlerinizi etiketleyebilir ve bununla ilgili iyi olan şey, çoğu fotoğraf yöneticisinin bunları kullanmasıdır, buna Shotwell dahildir. Örneğin:

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

Mevcut anahtar kelime listesini iki yeni anahtar kelimeyle (favori ve aile) değiştirin.

Testpicture.jpg Shotwell'e aktarıldığında, resim favori ve aile ile etiketlenir

Shotwell veritabanının bir sqlite veritabanı olduğunu bilmek yararlı olabilir; ~/.shotwell/datadizinine ve genellikle photo.db olarak adlandırılırsa, bilgisayarınıza başka bir yere kopyalayabilir ve sqlite ile erişebilirsiniz.

Sqlite için birkaç GUI ön uçları var, burada firefox için bir tane var ya da sqliteman kullanabilirsiniz . Bu ön uçların her ikisi de csv özelliklerine dışa aktarılır; etiketlerinizi csv'ye (Virgülle Ayrılmış Değerler) dışa aktardığınızda, başka bir fotoğraf yönetim yazılımının içe aktarıp aktarmayacağını kontrol edebilir ve etiketleri kendi veritabanlarındaki uygun alanla eşleştirebilirsiniz. Digikam'ın bunu yapabileceğine inanıyorum. Digikam ayrıca exif verilerini fotoğrafların içine yerleştirebilir.

Umarım Shotwell daha fazla özellik kazandıkça bu durum değişir.

GÜNCELLEME: Shotwell 0.7'nin bu etiketler oluşturuldukça etiketlerini resimlerde saklamaması doğru olsa da, etiketleri dışa aktarmayı seçerseniz resimlere gömülebilir, Adam bunu açıkça belirttiği için teşekkürler. Umarım bu ihracat jpegs ile uğraşırken kayıpsızdır. Dışa aktarma iletişim kutusundaki Ölçekleme seçeneği için orijinal boyutu seçerseniz şüpheliyim.


1
Dışa aktarma sırasında Ölçekleme seçeneği Orijinal Boyut ise ve fotoğraf düzenlenmemişse (renk ayarı, kırpma vb. Yok), kayıpsızdır. Döndürülen görüntüyü yeniden kodlamak yerine EXIF ​​bayrağını kullandığımız için fotoğrafın yönünü değiştirmenin de kayıpsız olduğunu unutmayın.
Jim Nelson

Shetwell tercihlerindeki "Etiketlerini, başlıklarını ve diğer meta verileri fotoğraf dosyalarına yaz" kutusunu, etiketlerini görüntü dosyalarına yazması için kontrol edebileceğinizi düşünüyorum.
15:16

2

Hızlı (kirli?) Python kodu Shotwell yükseltmeden bunu yapmak için (Ben 0.8.x itibariyle Shotwell etiketleri yazabilirsiniz, ancak Lucid bu yükseltme olamaz). Bu şey yıldız derecelendirmelerini etiket olarak yazacaktır (bunu istemiyorsanız açıkçası biraz yorum yapın).

Exiftool gerektirir. Hem shotwell veritabanındaki VE resimlerindeki tüm etiketleri (yani, görüntüleri içe aktarırken Shotwell'in içe aktardığı etiketleri) çoğaltacaktır. Ayrıca, büyük bir fotoğraf koleksiyonu için biraz zaman alır.

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)

0

Exif etiketlerini kullanarak resimlerinizi etiketlemenize izin veren gerçekten iyi bir GUI aracı / tarayıcı istiyorsanız (ve bu nedenle Shotwell'de de kullanılabilir), jBrout'u öneriyorum .

Ben ettik blogumda jBrout hakkında yazılan .

Yüklemek için Synaptic'e gidin, ayarları / depoları seçin, "Diğer Yazılımlar" sekmesini tıklayın, ardından "Ekle" düğmesini tıklayın ve bu satıra yapıştırın:

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

Sonra yeniden yükleyin ve jBrout arayın.


0

Yana ~/.shotwell/data/photo.dbolarak tanımlanır photo.db: SQLite 3.x databasedosya komutuyla, kullandığım SQLite Database Browser( sqlitebrowserAçmak için).

Hmmm ... okuyabilirsiniz :-) CVS dışa aktarma özelliği var.

Bu normal GUI yaklaşımı değildir, ancak bir yolu vardır.


0

Shotwell veritabanını ayrıştırmak için user38122 komut dosyasını kullanarak denedim ve işe yaramadı. Görünüşe göre şema son sürümlerde değiştirildi. Bunun yerine etiket kavşakları yapmak için pandaları (ki ben şahsen SQL yazmayı tercih ediyorum) kullanan aşağıdaki komut dosyasını yazdım. Aşağıdaki örnekte hem 'cat' etiketi hem de 'sleeping' etiketi bulunan tüm resimleri gösteriyorum.

#!/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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.