Yanıtlar:
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.
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 .
komutu kullanın; exiftool testpicture.jpg
daha ö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/data
dizinine 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.
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)
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.
Yana ~/.shotwell/data/photo.db
olarak tanımlanır photo.db: SQLite 3.x database
dosya komutuyla, kullandığım SQLite Database Browser
( sqlitebrowser
Açmak için).
Hmmm ... okuyabilirsiniz :-) CVS dışa aktarma özelliği var.
Bu normal GUI yaklaşımı değildir, ancak bir yolu vardır.
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'