雑記

Lightroom Classic CCとX RAW STUDIOを併用する際の課題をバッチファイルで処理する話

はじめに

需要がないのはわかっているんですが、誰かの役に立つかもしれないので記事にしておきます。

RAW現像の流れ

さて、本題に移っていきます。私が考えているRAW現像の流れと、その障壁となる課題を書き出してみました。

①Lightroom Classic CCでSD/CFカードから写真を読み込む

普通に撮影したデータはファイル名がこんな感じです。
f:id:dabcphoto:20180804223630j:plain
そこで、データを読み込む際には、ファイル名の頭に「yyyymmdd-」を付けます。また、末尾には「-XE3」を付けます。
これでファイル名に一意性を持たせることができます。読み込んだファイル名はRAFとJPGがそれぞれこうなります。f:id:dabcphoto:20180804223819j:plain

  • yyyymmdd-DSCF0001-XE3.JPG
  • yyyymmdd-DSCF0001-XE3.RAF

さらに、保存先のフォルダは、撮影日毎に「yyyy-mm-dd」というフォルダに振り分けることにします。後で見返すときに楽ですね。f:id:dabcphoto:20180804223834j:plainここまでLightroomの標準機能です。

②Lightroom Classic CCで写真の選定を行う

①で読み込んだ良い感じの写真に、せっせとレーティングを付けていきます。これで後で写真を探したいときに、かなり便利なことになります。f:id:dabcphoto:20180804223854j:plainここまでLightroomの標準機能です。

③X RAW STUDIOでRAW現像する

さてさて、X RAW STUDIOで②のレーティングを元にRAW現像・・・ができません。X RAW STUDIOではレーティングでごにょごにょする機能がありません。なんてナンセンスなソフトウェアなんだ。ということで、普通にしていると「yyyy-mm-dd」のフォルダから、せっせと目的の写真を探し直すことになります。マジでナンセンス。(※課題1)

④X RAW STUDIOでJPGを生成する

何はともあれ、③でRAW現像を終えたとしましょう。X RAW STUDIOから生成されるファイル名がまたナンセンス。(設定弄らせて欲しいなぁ。)RAFからX RAW STUDIOでRAW現像を繰り返すと、このような命名規則でファイルが生成されます。

yyyymmdd-DSCF0001-XE3.RAF
yyyymmdd-DSCF0001-XE3.JPG
⇒ yyyymmdd-DSCF0001-XE3(1).JPG
⇒ yyyymmdd-DSCF0001-XE3(2).JPG

出力先のフォルダでファイル名がダブったら、(1),(2),(3)・・・とファイルを生成していく仕様です。名前がダブらなければ(1)はつかない。ここで問題発生。赤字にしたファイル名って、①でLightroomが付けた名前と同じになってしまうんですよね。(※課題2)さらに厄介なことに、X RAW STUDIOは独自のプロファイルを生成します。そのため、下手に名前を変えると、RAW現像したときのパラメータが吹っ飛んじゃうんですね。面倒くさいことになるので、今回は放置することにしました。X RAW STUDIOくんの命名規則を守りましょう。

⑥RAW現像後のJPGをLightroom Classic CCで読み込む

仕上げです。Lightroomで写真を管理している都合上、④で生成したJPGをLightroomに認識させる必要があります。「yyyy-mm-dd」のフォルダに移さずに、その場で読み込ませるのが楽。伝わらないだろうけど、まぁそんな感じでやりたいんです。

課題

そんなわけでフローを書き出してみたら見えた課題。

(課題1) X RAW STUDIOでレーティング使えない問題

レーティングを使えない以上、何か別の方法でレーティングを付けたファイルを見分ける必要があります。私が考えた解決策としては、「Lightroom Classic CCで、レーティングを付けたファイルを一時フォルダに退避させる」です。こうすることで、X RAW STUDIOが読み込むファイルが最小限で済み、探す必要もなくなり、ハッピーハッピー!!と思っていたのですが、課題2が邪魔をしてきました。

(課題2)X RAW STUDIOが生成する名前がダブる問題

上述の通り、X RAW STUDIOはファイル名がダブります。マジで厄介です。一時フォルダにRAFだけを退避させ、そのフォルダでRAW現像をして、JPGを生成させると、ファイル名がダブります。ということは、RAFとJPGを同時に一時フォルダに退避させれば、この問題は回避できます。でもでも、そうすると今度はLightroomくんが「JPGいなくなった!!いなくなったよ!!」と認識してしまいます。おまえらマジでなんなんだ。うぜえ。

これからやること

  • レーティングを付けたRAFはLightroomで一時フォルダに退避する
f:id:dabcphoto:20180805062119j:plain
  • 退避したRAFと同名のJPGはバッチファイルで一時フォルダに退避する
  • X RAW STUDIOを使い、一時フォルダでRAW現像をする
  • RAW現像が終わったら、一時退避したJPGを元のフォルダにバッチファイルで戻す
  • X RAW STUDIOが書き出したJPGを一時フォルダで読み込ませ、その後正しいフォルダに移動する

以上
よーし、おじちゃん、頑張っちゃうぞーー!!

実際に作ったバッチファイル(.bat)

ということで、バッチファイル(.bat)ができました。3つに分けて、処理を分割してます。f:id:dabcphoto:20180805062212j:plain

①一時フォルダに移すJPGをテキストファイルにリストアップする

LightroomでRAFファイルを一時フォルダに移動します。一時フォルダに移動するのはRAFのみが前提。JPGを移してもいいけど、面倒くさいのでやめやめ。「00_filelist.txt」と「XX_move_filelist.txt」というテキストファイルを書き出します。「00_filelist.txt」には一時フォルダに対比したRAFのリストを書き出します。「XX_move_filelist.txt」にはRAFの拡張子をJPGに変更したリストを書き出します。

01_listup.bat

@echo off
cd /d %~dp0
dir !X-E3作業用*.RAF /B /A-D /ON > 00_filelist.txt
rem dir !X-E3作業用*.JPG /B /A-D /ON > 00_JPG_filelist.txt
copy nul XX_move_filelist.txt
rem 「file.txt」ファイルの内容を読み込みながら繰り返す
for /f %%i in (00_filelist.txt) do (
call :listup %%i
)
cscript 00.replaceStr.vbs
pause
:listup
setlocal
set filename=%1
set filename_body=%filename:~,21%
set yyyy=%filename:~,4%
set mm=%filename:~4,2%
set dd=%filename:~6,2%
set dirname=%yyyy%-%mm%-%dd%
set copy_filename=%filename:~,21%
forfiles /p %dirname% /m %filename_body%* >> XX_move_filelist.txt
exit /b

↑上のバッチファイルの処理中に、VBScriptを呼び出して処理をする。
Dim objWshShell ' WshShell オブジェクト
Dim txtFileName
txtFileName = "XX_move_filelist.txt"
Set objWshShell = WScript.CreateObject("WScript.Shell")
If Err.Number = 0 Then
'WScript.Echo "現在のフォルダは " & objWshShell.CurrentDirectory & " です。"
Else
WScript.Echo "エラー: " & Err.Description
break
End If
Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile( objWshShell.CurrentDirectory & "" & txtFileName, ForReading)
Do Until objFile.AtEndOfStream
strLine = objFile.Readline
strLine = Trim(strLine)
If Len(strLine) > 0 Then
strLine = Mid(strLine , 2 , len(strLine)-2)
strNewContents = strNewContents & strLine & vbCrLf
End If
Loop
objFile.Close
Set objFile = objFSO.OpenTextFile(objWshShell.CurrentDirectory & "" & txtFileName, ForWriting)
objFile.Write strNewContents
objFile.Close
Set objWshShell = Nothing
'msgbox "完了"

②リストアップしたファイルを一時フォルダに退避

リストに書き出したファイルはすべて「yyyymmdd-DSCF0001-XE3.JPG」なので、保存先は「yyyy-mm-dd」というフォルダに入っています。ということで、保存先からファイルを特定して、作業用の一時フォルダ「!X-E3作業用」に移動することができます。「set filename_body=%filename:~,21%」という行がありますが、これはDSCF0001の文字数から計算していますので、必要に応じて変更する必要があります。

02_move_workFile.bat

@echo off
cd /d %~dp0
rem 「file.txt」ファイルの内容を読み込みながら繰り返す
for /f %%i in (XX_move_filelist.txt) do (
call :file_move %%i
)
pause
:file_move
setlocal
set filename=%1
set yyyy=%filename:~,4%
set mm=%filename:~4,2%
set dd=%filename:~6,2%
set dirname=%yyyy%-%mm%-%dd%
set filename_body=%filename:~,21%
move %dirname%%filename% !X-E3作業用
exit /b

③退避した②のファイルを元のフォルダに戻す

Lightroomくんが気付かないように、移動したファイルを元に戻してあげます。②で書いたとおり、ファイル名から元々のフォルダがわかっているので、作業用の一時フォルダ「!X-E3作業用」から元のフォルダに戻すことができます。

03_return_workFile.bat

@echo off
cd /d %~dp0
for /f %%i in (XX_move_filelist.txt) do (
call :file_return %%i
REM echo %%i
)
pause
:file_return
setlocal
set filename=%1
set yyyy=%filename:~,4%
set mm=%filename:~4,2%
set dd=%filename:~6,2%
set dirname=%yyyy%-%mm%-%dd%
move !X-E3作業用%filename% %dirname%
exit /b

おわり

というわけで、誰にもわからせる気がない記事は以上で終わりです。門外漢なので、無駄な処理があるかも?でもまあ動くからいいや!全体的になんの話をしているのか知りたい人はこういう本を買ってみるといいかもしれません。

関連記事

続きの需要があるかわからず、時間もないので放置中。

ABOUT ME
abc
週末になったら湘南に出現するアマチュアフォトグラファー。社畜なので週末も仕事してます。
SUPPORT