『(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 & "スクリプトを終了します")