ฉันนำเข้ารูปภาพจำนวนมากไปยัง Shotwell และใช้แท็กการตั้งค่าเวลา แท็กเหล่านั้นถูกล็อคอินไว้ใน Shotwell หรือฉันสามารถส่งออกได้ (และนำเข้าอีกครั้งหรือใช้กับซอฟต์แวร์อื่น)
ฉันนำเข้ารูปภาพจำนวนมากไปยัง Shotwell และใช้แท็กการตั้งค่าเวลา แท็กเหล่านั้นถูกล็อคอินไว้ใน Shotwell หรือฉันสามารถส่งออกได้ (และนำเข้าอีกครั้งหรือใช้กับซอฟต์แวร์อื่น)
คำตอบ:
ฉันเป็นผู้ก่อตั้ง Yorba ผู้สร้าง Shotwell ขอบคุณสำหรับคำถามของคุณ
Shotwell 0.7 เขียนข้อมูลเมตา (เช่นแท็กและชื่อเรื่อง) ไปยังรูปภาพเมื่อคุณส่งออก ข้อมูลเมตาจะถูกเขียนในรูปแบบ EXIF, IPTC และ / หรือ XMP (ขึ้นอยู่กับว่ารูปแบบใดที่มีอยู่ในภาพถ่ายเพื่อเริ่มต้นด้วย) โปรแกรมภาพถ่ายอื่น ๆ ส่วนใหญ่สามารถอ่านรูปแบบเหล่านี้ได้ดังนั้นหากคุณส่งออกภาพถ่ายจาก Shotwell โปรแกรมอื่น ๆ ควรจะสามารถอ่านแท็กได้โดยไม่มีปัญหา
ที่จะเกิดขึ้น Shotwell 0.8 สามารถเขียนข้อมูลเมตาไฟล์ภาพในการบิน - การเปิดใช้งานนี้เลือกตัวเลือก " แท็กเขียนชื่อและข้อมูลอื่น ๆ ที่จะไฟล์ภาพ " ในการตั้งค่าการโต้ตอบ เมื่อเลือกตัวเลือกนี้แล้ว Shotwell จะอัปเดตข้อมูลเมตาในไฟล์ภาพถ่ายทันทีที่คุณติดแท็ก ในการใช้คุณสมบัตินี้ให้สร้างลำตัว Shotwell จากแหล่งที่มา (ดูที่http://yorba.org/shotwell/install/#source ) หรือเพียงแค่รอให้ Shotwell 0.8 (ซึ่งเราวางแผนจะวางจำหน่ายในเดือนธันวาคม)
น่าเสียดายที่ Shotwell ดูเหมือนจะเก็บแท็กไว้ในฐานข้อมูลของตัวเองแทนที่จะฝังไว้ใน exif, IPTC หรือ XMP ในรูปภาพ คุณสามารถตรวจสอบโดยใช้ exiftool ซึ่งสามารถติดตั้งได้โดยการติดตั้งแพคเกจlibimage-exiftool-perl ที่มีอยู่ในที่เก็บ
ใช้คำสั่ง; exiftool testpicture.jpg
เพื่อตรวจสอบภาพถ่ายชื่อ testpicture.jpg ที่คุณเคยติดแท็กด้วย Shotwell คุณจะเห็นว่าเอาต์พุต exiftool ไม่มีแท็ก Shotwell
ยูทิลิตี้ exiftool สามารถติดแท็กรูปภาพของคุณฝังแท็กในภาพถ่ายและสิ่งที่ดีเกี่ยวกับเรื่องนี้คือผู้จัดการรูปภาพส่วนใหญ่จะใช้พวกเขาซึ่งรวมถึง Shotwell ตัวอย่างเช่น:
exiftool -keywords=favourite -keywords=family testpicture.jpg
แทนที่รายการคำหลักที่มีอยู่ด้วยคำหลักใหม่สองคำ (รายการโปรดและตระกูล)
เมื่อ testpicture.jpg นำเข้าสู่ Shotwell รูปภาพจะถูกแท็กด้วยรายการโปรดและครอบครัว
การรู้ว่าฐานข้อมูล Shotwell เป็นฐานข้อมูล sqlite ที่อยู่ในคุณอาจเป็นประโยชน์ ~/.shotwell/data
ไดเรกทอรีและมักเรียกว่า photo.db คุณสามารถคัดลอกมันไว้ที่อื่นในคอมพิวเตอร์ของคุณและเข้าถึงด้วย sqlite
มีส่วนหน้า GUI ไม่กี่ SQLite, มีเป็นหนึ่งสำหรับFirefox ที่นี่หรือคุณสามารถใช้sqliteman ปลายด้านหน้าทั้งสองนี้มีการส่งออกไปยังคุณลักษณะ csv; เมื่อคุณส่งออกแท็กของคุณไปยัง csv (Comma Separated Values) คุณสามารถตรวจสอบว่าซอฟต์แวร์การจัดการรูปภาพอื่น ๆ จะนำเข้าและแมปแท็กไปยังฟิลด์ที่เหมาะสมในฐานข้อมูลของตนเองหรือไม่ ฉันเชื่อว่า Digikam สามารถทำได้ Digikam ยังสามารถฝังข้อมูล exif ในรูปถ่ายเอง
หวังว่าเมื่อ Shotwell ได้รับคุณสมบัติเพิ่มเติมสถานการณ์นี้จะเปลี่ยนไป
UPDATE: แม้ว่าจะเป็นความจริงที่ Shotwell 0.7 ไม่ได้จัดเก็บแท็กไว้ในรูปภาพเมื่อสร้างแท็กเหล่านี้แท็กสามารถฝังอยู่ในรูปภาพได้หากคุณเลือกที่จะส่งออกขอบคุณ Adam ที่ทำให้สิ่งนี้ชัดเจน หวังว่าการส่งออกนี้จะไม่สูญเสียเมื่อจัดการกับ jpegs ฉันสงสัยว่าถ้าเลือกขนาดดั้งเดิมสำหรับตัวเลือกการปรับขนาดในกล่องโต้ตอบการส่งออก
รหัสหลามด่วน (สกปรก?) โดยไม่ต้องอัพเกรด Shotwell (ฉันคิดว่า Shot.x 0.8.x สามารถเขียนแท็กได้ แต่คุณไม่สามารถอัปเกรดเป็น Lucid ได้) สิ่งนี้จะเขียนการจัดอันดับดาวเป็นแท็ก (แสดงความคิดเห็นนั้นค่อนข้างชัดเจนถ้าคุณไม่ต้องการ)
ต้องใช้ exiftool มันจะทำซ้ำแท็กใด ๆ ที่อยู่ในฐานข้อมูล shotwell และรูปภาพ (เช่นแท็กที่ Shotwell นำเข้าเมื่อนำเข้ารูปภาพ) ดังนั้นระวัง นอกจากนี้ยังใช้เวลาพักหนึ่งในการสะสมภาพถ่ายจำนวนมาก
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)
ถ้าคุณต้องการ GUI ที่ดีจริงๆเครื่องมือ / เบราว์เซอร์ที่จะช่วยให้คุณแท็กภาพของคุณโดยใช้แท็ก Exif (และดังนั้นจึงมีอยู่ใน Shotwell เกินไป) ผมขอแนะนำให้jBrout
ผมเคยเขียนเกี่ยวกับ jBrout บนบล็อกของฉัน
หากต้องการติดตั้งให้ไปที่ Synaptic เลือกการตั้งค่า / ที่เก็บคลิกที่แท็บ "ซอฟต์แวร์อื่น ๆ " จากนั้นกดปุ่ม "เพิ่ม" และวางในบรรทัดนี้:
deb http://jbrout.free.fr/download/debianไบนารี /
จากนั้นโหลดซ้ำและค้นหา jBrout
เนื่องจาก~/.shotwell/data/photo.db
ถูกระบุว่าเป็นphoto.db: SQLite 3.x database
โดยคำสั่งไฟล์ฉันใช้SQLite Database Browser
( sqlitebrowser
) เพื่อเปิด
อืม ... คุณสามารถอ่านได้ :-) มันมีคุณสมบัติการส่งออก CVS
นี่ไม่ใช่วิธี GUI ปกติ แต่มีวิธี
ฉันลองใช้สคริปต์ของ user38122เพื่อแยกวิเคราะห์ฐานข้อมูล shotwell และไม่ได้ผล เห็นได้ชัดว่าสคีมามีการเปลี่ยนแปลงในรุ่นล่าสุด แต่ฉันเขียนสคริปต์ต่อไปนี้ที่ใช้แพนด้า (ซึ่งฉันชอบเขียน SQL) เป็นการส่วนตัวเพื่อทำแท็กทางแยก ในตัวอย่างด้านล่างฉันแสดงภาพทั้งหมดที่มีทั้งแท็ก 'cat' และแท็ก 'sleep'
#!/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'