04 November 2020

exiftoolを使い、GimpでExifのソフトウエア名と日時が書き換えられてしまう問題への事後対処

(Ubuntu)GimpでExifのソフトウエア名と日時が書き換えられてしまう問題への対処』に書いたように、LinuxではGimp側を修正することでこの「無断書き換え」問題が起こらなくなるが、Windowsではその対応がむつかしい。(もちろん、Gimpをビルドする環境を整えるのなら別だが… 素人には無理でしょう)

そこで、Gimpで書き換えられてしまったソフトウエア名や日時を、exiftoolというコマンドラインツールを使って書き戻してしまう対処方法を記す。

exiftoolのコマンドライン書式

Gimpで書き換えられてしまったタグを元に戻すコマンドライン(SONY DSC-RX100の場合)

exiftool -if "$Exif:Model =~ /DSC-RX100/i and $Exif:Software =~ /Gimp/i" -overwrite_original -preserve -Exif:Software="DSC-RX100 v1.10" "-Exif:ModifyDate<$Exif:CreateDate" 画像ファイル名

メーカータグが「PENTAX」の場合、Gimpで編集前に「Pentax Corp.」に書き換えるためのコマンドライン

exiftool -if "$Exif:Make eq 'PENTAX'" -overwrite_original -preserve -Exif:Make="Pentax Corp." 画像ファイル名

ちなみに… Linux シェルではダブルクォーテーション " ... " で囲まれた中に、$で始まる変数を置くと展開されてしまうため、

Linux シェルの場合 (参考)
exiftool -if '$Exif:Make eq "PENTAX"' -overwrite_original -preserve -Exif:Make="Pentax Corp." 画像ファイル名

のようにしなければならない。

エクスプローラのSendTo(送る)にスクリプトを置いて使う

このスクリプトの引数に、ファイル名(フルパス)をしていすれば、そのファイル単体、あるいはファイルのあるディレクトリ内の全ファイルを処理対象にできる。

gimp_exif_fix.vbs
Option Explicit
 
Dim strArg
Dim strTargetPath
Dim fso
Dim objWshShell
Dim objExec
 
' プログラムの引数(Explorerの送る(Send To)により、フルパスのファイル名が格納されている
strArg = Wscript.Arguments(0)
 
' ファイル単体/ディレクトリのどちらのモードで処理するか、ユーザに選択を促す
Set fso = CreateObject("Scripting.FileSystemObject")
Dim ans
ans = MsgBox("Gimpで編集したJPEG ExifデータのSoftwareとModifyDateの書き戻し修正、" & vbCRLF & _
            "編集前にMakeをPENTAXからPentax Corpに修正するスクリプトです。" & vbCRLF & vbCRLF & _
            "処理対象はどちらにしますか?" & vbCRLF & vbCRLF & _
            "[Yes] ディレクトリ全体の場合 = " & fso.GetParentFolderName(strArg) & vbCRLF & _
            "[No]  ファイル単体の場合     = " & strArg & vbCRLF & _
            "[キャンセル] 終了"& vbCRLF & vbCRLF & _
            "YES or No を選択してください", vbYesNoCancel, "VBScript Exif Fix")
If ans = vbYes then
    ' ディレクトリ全体を対象とする
    strTargetPath = fso.GetParentFolderName(strArg)
ElseIf ans = vbNo then
    ' ファイル単体を対象とする
    strTargetPath = strArg
Else
    MsgBox("ユーザによってキャンセルされました")
    WScript.Quit
End If
 
' カメラ機種ごとの、exiftool コマンドラインの定義
Dim strCommandPentaxMake : strCommandPentaxMake = "exiftool -if ""$Exif:Make eq 'PENTAX'"" -overwrite_original -preserve -Exif:Make=""Pentax Corp."" "
Dim strCommandPentax : strCommandPentax = "exiftool -if ""$Exif:Model =~ /PENTAX K-x/i and $Exif:Software =~ /Gimp/i"" -overwrite_original -preserve -Exif:Software=""K-x Ver 1.03"" ""-Exif:ModifyDate<$Exif:CreateDate"""
Dim strCommandSonyRx100 : strCommandSonyRx100 = "exiftool -if ""$Exif:Model =~ /DSC-RX100/i and $Exif:Software =~ /Gimp/i"" -overwrite_original -preserve -Exif:Software=""DSC-RX100 v1.10"" ""-Exif:ModifyDate<$Exif:CreateDate"""
 
Set objWshShell = CreateObject("WScript.Shell")
 
if MsgBox("Gimp編集前にMakeタグのPENTAXをPentax Corp.に書き換えますか ?" & vbCRLF & vbCRLF & _
        "対象 = " & strTargetPath, vbYesNo) = vbYes then
    Set objExec = objWshShell.Exec(strCommandPentaxMake & " " & strTargetPath)
    MsgBox("実行コマンド : " & strCommandPentaxMake & " " & strTargetPath & vbCRLF & vbCRLF & objExec.StdOut.ReadAll)
End If
 
if MsgBox("PENTAX K-xのSoftwareとModifyDateの書き戻し修正をしますか ?" & vbCRLF & vbCRLF & _
        "対象 = " & strTargetPath, vbYesNo) = vbYes then
    Set objExec = objWshShell.Exec(strCommandPentax & " " & strTargetPath)
    MsgBox("実行コマンド : " & strCommandPentax & " " & strTargetPath & vbCRLF & vbCRLF & objExec.StdOut.ReadAll)
End If
 
if MsgBox("SONY DSC-RX100のSoftwareとModifyDateの書き戻し修正をしますか ?" & vbCRLF & vbCRLF & _
        "対象 = " & strTargetPath, vbYesNo) = vbYes then
    Set objExec = objWshShell.Exec(strCommandSonyRx100 & " " & strTargetPath)
    MsgBox("実行コマンド : " & strCommandSonyRx100 & " " & strTargetPath & vbCRLF & vbCRLF & objExec.StdOut.ReadAll)
End If
 
MsgBox("全ての処理が終了しました" & vbCRLF & "スクリプトを終了します")