উত্তর:
আমি ইওরবার প্রতিষ্ঠাতা, শটওয়েলের নির্মাতারা। আপনার প্রশ্নের জন্য ধন্যবাদ।
শটওয়েল 0.7 ফটো রপ্তানি করার সময় মেটাডেটা (যেমন ট্যাগ এবং শিরোনাম) লিখেছেন। মেটাডেটাটি এক্সআইএফ, আইপিটিসি এবং / বা এক্সএমপি ফর্ম্যাটে লেখা হয় (এর মধ্যে কোনটি ছবির সাথে উপস্থিত ছিল তার উপর নির্ভর করে)। বেশিরভাগ অন্যান্য ফটো প্রোগ্রামগুলি এই ফর্ম্যাটগুলি পড়তে পারে, তাই আপনি যদি শটওয়েল থেকে আপনার ফটো রফতানি করেন তবে অন্যান্য প্রোগ্রামগুলি কোনও সমস্যা ছাড়াই তাদের ট্যাগগুলি পড়তে সক্ষম হবে।
আসন্ন শটওয়েল 0.8 ফ্লাইতে ফটো ফাইলগুলিতে মেটাডেটা লিখতে পারে - এটি সক্ষম করতে, পছন্দগুলি ডায়ালগটিতে " ট্যাগ, শিরোনাম এবং ফটো ফটোগুলিতে অন্যান্য মেটাডেটা লিখুন " বিকল্পটি নির্বাচন করুন । এটি একবার নির্বাচিত হয়ে গেলে, শটওয়েল আপনার ট্যাগ করার সাথে সাথে ফটো ফাইলগুলিতে মেটাডেটা আপডেট করবে। এই বৈশিষ্ট্যটি ব্যবহার করতে, উত্স থেকে শটওয়েল ট্রাঙ্কটি তৈরি করুন (দেখুন http://yorba.org/hotwell/install/#source ) বা শটওয়েল 0.8 (যা আমরা ডিসেম্বরে পরে প্রকাশের পরিকল্পনা করি) এর জন্য অপেক্ষা করুন।
দুর্ভাগ্যক্রমে শটওয়েলগুলি ছবিগুলিতে এক্সিফ, আইপিটিসি বা এক্সএমপি হিসাবে এম্বেড করার পরিবর্তে ট্যাগগুলি নিজের ডাটাবেসে রাখে বলে মনে হয়। আপনি এক্সিফ্টোল ব্যবহার করে পরীক্ষা করতে পারেন, যা প্যাকেজটি ইনস্টল করে ইনস্টল করা যেতে পারে libimage-exiftool-perl , সংগ্রহস্থলগুলিতে উপলব্ধ।
কমান্ড ব্যবহার; exiftool testpicture.jpg
টেস্টপিকচার.জেপজি নামে একটি ছবি যাচাই করার জন্য আপনি শটওয়েলের সাথে আগে ট্যাগ করেছিলেন। আপনি দেখতে পাবেন যে এক্সিফটোল আউটপুটে কোনও শটওয়েল ট্যাগ নেই।
এক্সিফ্টোল ইউটিলিটি আপনার ছবিগুলিতে ফটোতে এম্বেড করা ছবিগুলিতে ট্যাগ করতে পারে এবং এ সম্পর্কে ভাল বিষয়টি হ'ল বেশিরভাগ ফটো পরিচালকরা সেগুলি ব্যবহার করবেন, এতে শটওয়েল অন্তর্ভুক্ত রয়েছে। উদাহরণ স্বরূপ:
exiftool -keywords=favourite -keywords=family testpicture.jpg
দুটি নতুন কীওয়ার্ড (প্রিয় এবং পরিবার) দিয়ে বিদ্যমান কীওয়ার্ড তালিকাটি প্রতিস্থাপন করুন।
টেস্টপিকচার.জেপিজি যখন শটওয়েলে আমদানি করা হয় তখন ছবিটি প্রিয় এবং পরিবারের সাথে ট্যাগ করা হবে
এটি জেনে রাখা সহায়ক হতে পারে যে শটওয়েল ডাটাবেস আপনার মধ্যে অবস্থিত একটি স্ক্লাইট ডাটাবেস; ~/.shotwell/data
ডিরেক্টরি এবং সাধারণত photo.db নামে পরিচিত, আপনি এটি আপনার কম্পিউটারে অন্য কোথাও অনুলিপি করতে পারেন এবং স্ক্লাইট দিয়ে এটি অ্যাক্সেস করতে পারেন।
স্ক্লাইটের জন্য কয়েকটি জিইউআই সম্মুখভাগ রয়েছে, এখানে ফায়ারফক্সের জন্য একটি রয়েছে বা আপনি স্ক্লাইটম্যান ব্যবহার করতে পারেন । এই উভয় সম্মুখ প্রান্তে সিএসভি বৈশিষ্ট্য রফতানি হয়েছে; আপনি যখন সিএসভিতে আপনার ট্যাগগুলি রফতানি করেন (কমা বিভাজিত মান) আপনি অন্য কোনও ফটো ম্যানেজমেন্ট সফ্টওয়্যার ট্যাগগুলি নিজের ডাটাবেসে উপযুক্ত ক্ষেত্রে আমদানি করতে এবং ম্যাপ করতে পারবেন কিনা তা পরীক্ষা করতে পারেন check আমি বিশ্বাস করি ডিজিকাম এটি করতে পারে। ডিজিকাম নিজে ফটোতে এক্সিফ ডেটা এম্বেড করতে পারে।
আশা করি শটওয়েল আরও বৈশিষ্ট্য অর্জন করার সাথে সাথে এই পরিস্থিতি পরিবর্তন হবে।
আপডেট: যদিও এটি সত্য যে শটওয়েল ০.০ এই ট্যাগগুলি তৈরি করার সাথে সাথে ছবিগুলিতে তার ট্যাগগুলি সংরক্ষণ করে না, আপনি যদি ট্যাগগুলি রফতানি করতে চান তবে ছবিগুলিতে এম্বেড করা যেতে পারে, ধন্যবাদ অ্যাডামকে এটি পরিষ্কার করার জন্য। আশা করি jpegs এর সাথে লেনদেন করার সময় এই রফতানি ক্ষতিহীন। আমি সন্দেহ করি এটি যদি হয়, কেউ যদি রফতানি কথোপকথনে স্কেলিং বিকল্পের জন্য মূল আকার নির্বাচন করে।
দ্রুত (নোংরা?) অজগর কোডটি শটওয়েল আপগ্রেড না করে এটি করার জন্য (আমি মনে করি 0.8.x হিসাবে শটওয়েল ট্যাগ লিখতে পারে, তবে আপনি লুসিডে আপগ্রেড করতে পারবেন না)। এই জিনিসটি স্টার-রেটিংগুলি ট্যাগ হিসাবে লিখে ফেলবে (মন্তব্যটি করুন যে বিট আউট, স্পষ্টতই, যদি আপনি এটি না চান)।
এক্সিফটোল প্রয়োজন। এটি শটওয়েল ডাটাবেস এবং চিত্রগুলিতে উভয়ই যে কোনও ট্যাগ নকল করবে (যেমন চিত্রগুলি আমদানির সময় শটওয়েল আমদানি করেছিল) তাই এটির জন্য নজর রাখুন। এছাড়াও, ফটোগুলির বড় সংগ্রহের জন্য বেশ কিছুক্ষণ সময় লাগে।
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 ট্যাগ ব্যবহার করে আপনার চিত্রগুলি ট্যাগ করতে দেয় (এবং এটিই শটওয়েলে উপলব্ধ), আমি জেব্রাউটকে প্রস্তাব দিই ।
আমি আমার ব্লগে জেব্রাউট সম্পর্কে লিখেছি ।
এটি ইনস্টল করতে, সিন্যাপটিক এ যান, সেটিংস / সংগ্রহস্থলগুলি চয়ন করুন, "অন্যান্য সফ্টওয়্যার" ট্যাবে ক্লিক করুন, তারপরে "অ্যাড" বোতামটি চাপুন এবং এই লাইনে পেস্ট করুন:
দেব http://jbrout.free.fr/download/debian বাইনারি /
তারপরে পুনরায় লোড করুন এবং jBrout অনুসন্ধান করুন।
যেহেতু ফাইল কমান্ড দ্বারা ~/.shotwell/data/photo.db
চিহ্নিত করা photo.db: SQLite 3.x database
হয়েছে, তাই আমি SQLite Database Browser
( sqlitebrowser
) এটি খোলার জন্য ব্যবহার করেছি।
হুমমম ... আপনি এটি পড়তে পারেন :-) এতে সিভিএস এক্সপোর্ট বৈশিষ্ট্য রয়েছে।
এটি সাধারণ জিইউআই পদ্ধতির নয় তবে একটি উপায় রয়েছে।
আমি শটওয়েল ডাটাবেস বিশ্লেষণের জন্য ব্যবহারকারীর 38122 এর স্ক্রিপ্টটি ব্যবহার করার চেষ্টা করেছি এবং এটি কার্যকর হয়নি। স্পষ্টতই স্কিমার সাম্প্রতিক সংস্করণগুলিতে পরিবর্তন করা হয়েছে। পরিবর্তে আমি নীচের স্ক্রিপ্টটি লিখেছিলাম যা ট্যাগ ছেদগুলি করতে পান্ডাস (যা আমি ব্যক্তিগতভাবে এসকিউএল লেখার পক্ষে পছন্দ করি) ব্যবহার করি। নীচের উদাহরণে আমি সমস্ত চিত্র দেখাই যেগুলিতে 'বিড়াল' ট্যাগ এবং ট্যাগ 'ঘুমন্ত' উভয়ই রয়েছে।
#!/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'