ฉันสามารถส่งออกฐานข้อมูลภาพ Shotwell เพื่อบันทึกแท็กทั้งหมดได้หรือไม่


14

ฉันนำเข้ารูปภาพจำนวนมากไปยัง Shotwell และใช้แท็กการตั้งค่าเวลา แท็กเหล่านั้นถูกล็อคอินไว้ใน Shotwell หรือฉันสามารถส่งออกได้ (และนำเข้าอีกครั้งหรือใช้กับซอฟต์แวร์อื่น)

คำตอบ:


22

ฉันเป็นผู้ก่อตั้ง Yorba ผู้สร้าง Shotwell ขอบคุณสำหรับคำถามของคุณ

Shotwell 0.7 เขียนข้อมูลเมตา (เช่นแท็กและชื่อเรื่อง) ไปยังรูปภาพเมื่อคุณส่งออก ข้อมูลเมตาจะถูกเขียนในรูปแบบ EXIF, IPTC และ / หรือ XMP (ขึ้นอยู่กับว่ารูปแบบใดที่มีอยู่ในภาพถ่ายเพื่อเริ่มต้นด้วย) โปรแกรมภาพถ่ายอื่น ๆ ส่วนใหญ่สามารถอ่านรูปแบบเหล่านี้ได้ดังนั้นหากคุณส่งออกภาพถ่ายจาก Shotwell โปรแกรมอื่น ๆ ควรจะสามารถอ่านแท็กได้โดยไม่มีปัญหา

ที่จะเกิดขึ้น Shotwell 0.8 สามารถเขียนข้อมูลเมตาไฟล์ภาพในการบิน - การเปิดใช้งานนี้เลือกตัวเลือก " แท็กเขียนชื่อและข้อมูลอื่น ๆ ที่จะไฟล์ภาพ " ในการตั้งค่าการโต้ตอบ เมื่อเลือกตัวเลือกนี้แล้ว Shotwell จะอัปเดตข้อมูลเมตาในไฟล์ภาพถ่ายทันทีที่คุณติดแท็ก ในการใช้คุณสมบัตินี้ให้สร้างลำตัว Shotwell จากแหล่งที่มา (ดูที่http://yorba.org/shotwell/install/#source ) หรือเพียงแค่รอให้ Shotwell 0.8 (ซึ่งเราวางแผนจะวางจำหน่ายในเดือนธันวาคม)


+1 ฉันเป็นผู้ใช้ใหม่ของ Shotwell; ขอบคุณสำหรับการทำงานที่ดีทั้งหมดของคุณ
msw

3
การเขียนเมตาแท็กในทันทีทำงานย้อนหลังหรือไม่
hultqvist

@hultqvist ใช่ฉันเพิ่งตรวจสอบตัวเลือกและ shotwell เริ่มเขียนลงในรูปภาพของฉันหลังจากนั้น
ผู้ใช้บางคน

9

น่าเสียดายที่ 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 ฉันสงสัยว่าถ้าเลือกขนาดดั้งเดิมสำหรับตัวเลือกการปรับขนาดในกล่องโต้ตอบการส่งออก


1
ในระหว่างการส่งออกหากตัวเลือกการปรับขนาดเป็นขนาดดั้งเดิมและไม่มีการแก้ไขภาพ (ไม่มีการปรับสีการครอบตัด ฯลฯ ) จะไม่มีการสูญเสีย โปรดทราบว่าการเปลี่ยนการวางแนวของภาพถ่ายนั้นไม่มีความสูญเสียเช่นกันเนื่องจากเราใช้ธง EXIF ​​แทนการเข้ารหัสภาพที่หมุนอีกครั้ง
Jim Nelson

ฉันเชื่อว่าคุณสามารถทำเครื่องหมายในช่อง "เขียนแท็กชื่อเรื่องและข้อมูลเมตาอื่น ๆ ไปยังไฟล์ภาพถ่าย" ในการตั้งค่าของ Shetwell เพื่อให้แท็กนั้นเขียนแท็กลงในไฟล์ภาพ
JellicleCat

2

รหัสหลามด่วน (สกปรก?) โดยไม่ต้องอัพเกรด 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)

0

ถ้าคุณต้องการ GUI ที่ดีจริงๆเครื่องมือ / เบราว์เซอร์ที่จะช่วยให้คุณแท็กภาพของคุณโดยใช้แท็ก Exif (และดังนั้นจึงมีอยู่ใน Shotwell เกินไป) ผมขอแนะนำให้jBrout

ผมเคยเขียนเกี่ยวกับ jBrout บนบล็อกของฉัน

หากต้องการติดตั้งให้ไปที่ Synaptic เลือกการตั้งค่า / ที่เก็บคลิกที่แท็บ "ซอฟต์แวร์อื่น ๆ " จากนั้นกดปุ่ม "เพิ่ม" และวางในบรรทัดนี้:

deb http://jbrout.free.fr/download/debianไบนารี /

จากนั้นโหลดซ้ำและค้นหา jBrout


0

เนื่องจาก~/.shotwell/data/photo.dbถูกระบุว่าเป็นphoto.db: SQLite 3.x databaseโดยคำสั่งไฟล์ฉันใช้SQLite Database Browser( sqlitebrowser) เพื่อเปิด

อืม ... คุณสามารถอ่านได้ :-) มันมีคุณสมบัติการส่งออก CVS

นี่ไม่ใช่วิธี GUI ปกติ แต่มีวิธี


0

ฉันลองใช้สคริปต์ของ 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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.