web-dev-qa-db-ja.com

すべてのタグを保存してShotwellの写真データベースをエクスポートできますか?

多くの写真をShotwellにインポートし、タグの設定に時間を費やしました。それらのタグはShotwellにロックインされていますか、それともエクスポート(およびインポートまたは他のソフトウェアで使用)できますか?

14
Ivan

ShotwellのメーカーであるYorbaの創設者です。ご質問ありがとうございます。

Shotwell 0.7は、エクスポート時にメタデータ(タグやタイトルなど)を写真に書き込みます。メタデータは、EXIF、IPTC、XMP形式のいずれかまたは両方で書き込まれます(最初に写真に含まれていたものに応じて)。他のほとんどの写真プログラムはこれらの形式を読み取ることができるため、Shotwellから写真をエクスポートする場合、他のプログラムは問題なくタグを読み取ることができます。

Shotwell 0.8は、写真ファイルにメタデータを即座に書き込むことができます-これを有効にするには、オプション「写真ファイルにタグ、タイトル、その他のメタデータを書き込みます "環境設定ダイアログで。これを選択すると、Shotwellは、タグを付けるとすぐに写真ファイルのメタデータを更新します。この機能を使用するには、ソースからShotwellトランクをビルドするか( http://yorba.org/shotwell/install/#source を参照)、またはShotwell 0.8を待つだけです(後ほどリリースする予定です) 12月)。

22
Adam Dingle

残念ながら、Shotwellはタグをexif、IPTCまたはXMPとして写真に埋め込むのではなく、独自のデータベースに保持しているようです。リポジトリで利用可能なパッケージ libimage-exiftool-Perl をインストールすることでインストールできるexiftoolを使用して確認できます。

ここにいくつかの例を参照

コマンドを使用します。 exiftool testpicture.jpgを使用して、以前にShotwellでタグ付けしたtestpicture.jpgという写真を確認します。 exiftoolの出力にはShotwellタグが含まれていないことがわかります。

Exiftoolユーティリティは、写真にタグを埋め込んだ写真にタグを付けることができます。これに関する良い点は、ほとんどの写真マネージャーがそれらを使用することです。これにはShotwellが含まれます。例えば:

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

既存のキーワードリストを2つの新しいキーワード(お気に入りとファミリー)に置き換えます。

Testpicture.jpgがShotwellにインポートされると、写真にお気に入りと家族のタグが付けられます

Shotwellデータベースがsqliteデータベースであることを知っておくと役立つ場合があります。 ~/.shotwell/dataディレクトリで、通常はphoto.dbと呼ばれます。コンピューター上の別の場所にコピーして、sqliteでアクセスできます。

SqliteにはいくつかのGUIフロントエンドがあり、 firefox here のGUIフロントエンドがあります。または sqliteman を使用できます。これらのフロントエンドには両方ともcsv機能へのエクスポートがあります。タグをcsv(カンマ区切り値)にエクスポートすると、他の写真管理ソフトウェアがタグをインポートし、独自のデータベースの適切なフィールドにマップするかどうかを確認できます。 Digikamはこれができると信じています。 Digikamは、写真自体にexifデータを埋め込むこともできます。

Shotwellがより多くの機能を獲得するにつれて、この状況が変わることを願っています。

更新:Shotwell 0.7はこれらのタグが作成されるときにタグを画像に保存しないのは事実ですが、エクスポートすることを選択した場合、タグを画像に埋め込むことができます。うまくいけば、このエクスポートは、jpegを処理するときにロスレスになります。エクスポートダイアログのスケーリングオプションに元のサイズを選択した場合、そうだと思います。

9
Sabacon

クイック(ダーティ?)pythonコードは、Shotwellをアップグレードせずにこれを実行します(0.8.xの時点でShotwellはタグを書き出すことができますが、Lucidではアップグレードできません)。このことは、星の評価をタグとして書き出します(明らかに、それを望まない場合は、そのコメントをコメントアウトしてください)。

Exiftoolが必要です。ショットウェルデータベースと画像(つまり、画像をインポートしたときに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)
2
user38122

Exifタグを使用して画像にタグを付けることができる(したがってShotwellでも使用できる)本当に優れたGUIツール/ブラウザーが必要な場合は、 jBrout をお勧めします。

私のブログでjBroutについて書いた

それをインストールするには、Synapticに行き、設定/リポジトリを選択し、「その他のソフトウェア」タブをクリックしてから、「追加」ボタンを押してこの行に貼り付けます:

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

次に、リロードしてjBroutを検索します。

0
Scaine

~/.shotwell/data/photo.dbはファイルコマンドでphoto.db: SQLite 3.x databaseとして識別されるため、SQLite Database Browsersqlitebrowser)を使用して開きました。

うーん...あなたはそれを読むことができます:-)それはCVSエクスポート機能を持っています。

これは通常のGUIアプローチではありませんが、方法があります。

0
Osamu Aoki

Shotwellデータベースの解析に ser38122のスクリプト を使用しようとしましたが、機能しませんでした。どうやら最近のバージョンでスキーマが変更されたようです。代わりに、pandas(個人的にはSQLの作成を好む)を使用してタグの交差を行う次のスクリプトを作成しました。以下の例では、タグ「cat」とタグ「sleeping」の両方を持つすべての画像を示しています。

#!/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'
0
Dov Grobgeld