Lightroomのカタログファイルをデータベースとして読む(2)
Lightroomのカタログから以下のようなテーブル情報を取得します。
注意事項
これからPython、SQLでカタログ(.lrcat)にアクセスしますが、Adobeが想定していない使い方になりますのでカタログを破損する可能性があります。
カタログはコピーをとって、コピーに対してアクセスすることを推奨します。(基本ここではSELECT文しか使わないのでカタログを壊すような操作はないはずですが、考慮できていない要素がないとも言い切れないため)
lrcatにアクセス
lrcatには多くのテーブルがありますが、主に使うのは以下4つのテーブルです
Adobe_images:写真に関する基本的な情報
AgLibraryFile:写真ファイルのパス
AgHarvestedExifMetaData:Exif情報(撮影設定情報)
AgHarvestedIptcMetaData:IPTC情報(市区町村など)
lrcatからテーブルデータを取ってくる最小コードは以下の通りです。
Adobe_imagesのデータをそのままとってきています。
import pandas as pd
import sqlite3
db_path = 'path_to_catalog/hoge.lrcat'
con = sqlite3.connect(db_path)
query = """
select * from Adobe_images;
"""
df = pd.read_sql(query,con=con)
クエリのイメージ
複数の情報をまとめて取得したいので、前述の4つのテーブルをJOINします。また、ファイルのパスやカメラ名、レンズ名、市区町村など文字列で入る項目は、直接文字列が入っているわけではなくidが入っており、対応するテーブルとJOINすることで、文字列に置き換えています。
クエリは長くなるので、Githubに上げました。
変換が必要な項目
aperture, shutterSpeedは、いずれもAPEX値という単位で入っており、適切に変換するとそれぞれF値、露光時間に変換することができます。
あまり式の中身まで追ってないですが、以下のコードを参考にしました。
# 参考:https://github.com/fdenivac/Lightroom-SQL-tools/blob/e57c0fc21f426d163df21a8c078d76f21ff1975e/lrtools/display.py
def conv_to_f_number(aperture):
if round(2**(aperture/2),1)*10%10==0:
return 'F%.0f' % 2**(aperture/2)
return 'F%.1f' % 2**(aperture/2)
def conv_to_exposure_time(shutterSpeed):
if 2**shutterSpeed > 1:
return '1/%.0f' % (2**shutterSpeed)
return '%.0f' % (1/2**shutterSpeed)
ExifにAPEX値で入っていることの参考サイト
まとめ
SQLクエリ
Pythoスクリプト
import pandas as pd
import numpy as np
from pathlib import Path
import sqlite3
db_path = 'path_to_catalog/hoge.lrcat'
con = sqlite3.connect(db_path)
with open('get_photo_info.sql') as f:
query = f.read()
def conv_to_f_number(aperture):
if pd.isna(aperture):
return np.nan
if round(2**(aperture/2),1)*10%10==0:
return 'F%.0f' % 2**(aperture/2)
return 'F%.1f' % 2**(aperture/2)
def conv_to_exposure_time(shutterSpeed):
if pd.isna(shutterSpeed):
return np.nan
if 2**shutterSpeed > 1:
return '1/%.0f' % (2**shutterSpeed)
return '%.0f' % (1/2**shutterSpeed)
df_lr = pd.read_sql(query,con=con)
df_lr["fNumber"] = df_lr["aperture"].map(conv_to_f_number)
df_lr["shutterSpeed"]=df_lr["shutterSpeed"].map(conv_to_exposure_time)
df_lr["full_path"] = df_lr.apply(lambda x:Path(x["rootFolder"])/x["pathFromRoot"]/x["idx_filename"],axis=1)
これで冒頭示したようなテーブル情報が得られます。
次回は、このデータの可視化例について紹介します。