デジカメの時計がズレてことが良くある。
先日も11分進んでいた。
デジカメだけ使うのであれば何とかなるが、これにスマホで撮った写真が混在すると、
時系列がめちゃめちゃになってしまい後で整理するのが面倒。
そこで、JPEGファイルの更新日時・EXIFの撮影日時を一括で補正するツールを考えてみる。
先日も11分進んでいた。
デジカメだけ使うのであれば何とかなるが、これにスマホで撮った写真が混在すると、
時系列がめちゃめちゃになってしまい後で整理するのが面倒。
そこで、JPEGファイルの更新日時・EXIFの撮影日時を一括で補正するツールを考えてみる。
仕様
PowerShellでJPEGファイルの日付を補正するツールを作成する。
起動方法:
起動方法:
JpegTimeCorrection.ps1 (JPEGファイルパス $inputDir) (出力先パス $outputDir) (補正値 $correctionValue)
ファイル一覧取得
JPEGファイル一覧の取得はGet-ChildItemコマンドレットを使用する。
入力パス(-Path)は $inputDir\*.*、対象の拡張子(-Include)は "*.jpg" と "*.jpeg" とする。
サブフォルダは対象外とする。
取得したファイル一覧を $files へ格納する。
入力パス(-Path)は $inputDir\*.*、対象の拡張子(-Include)は "*.jpg" と "*.jpeg" とする。
サブフォルダは対象外とする。
取得したファイル一覧を $files へ格納する。
$files = Get-ChildItem -Path $inputDir -Include *.jpg,*.jpeg
メインループ
取得した $files を1ファイルずつループする。
ループ中のファイル名を $file に格納する。
ループ内にメイン処理を記述する。
メイン処理で発生した例外を try - catch でキャッチし、成功可否を画面表示する。
※ 次回記事:JPEG時刻補正ツールを作る #2
ループ中のファイル名を $file に格納する。
ループ内にメイン処理を記述する。
メイン処理で発生した例外を try - catch でキャッチし、成功可否を画面表示する。
foreach ($file in $files) { try { # メイン処理 # Write-Host( "[OK] " + $file.Name) } catch { Write-Host( "[ER] " + $file.Name + "`r`n" + $_) } }
更新日時取得
ループ中ファイル名の更新日時を取得し $fileDate へ格納する。
$fileDate = (Get-ItemProperty -Path $file).LastWriteTime
時刻の加減算
取得した更新日時の"分"に引数の $correctionValue を加算する。
$correctionValue に負数を指定すれば減算となる。
※ 過去記事:PowerShell:時刻の加算・減算
$correctionValue に負数を指定すれば減算となる。
※ 過去記事:PowerShell:時刻の加算・減算
$fileDate = (Get-ItemProperty -Path $file).LastWriteTime.AddMinutes($correctionValue)
Exif情報変更
ループ中ファイルの撮影日時を、先ほど計算した更新日時に変更する。
万が一、元のファイルが壊れるかもしれないので、引数 $outputDir で指定した場所にコピーしたファイルに対して変更を行う。
この処理は、過去に作成した "JPEG更新日時一括変換ツール (ChangeJpegDate.ps1)" の SetExifInfo関数を流用するが、Exif情報は既に存在している事を前提とするため、ExifVersionを追加する処理(SetExifVersion関数の呼び出し)はコメントアウトする。
※ 過去記事:JPEG更新日時一括変更ツールを作る #6
万が一、元のファイルが壊れるかもしれないので、引数 $outputDir で指定した場所にコピーしたファイルに対して変更を行う。
この処理は、過去に作成した "JPEG更新日時一括変換ツール (ChangeJpegDate.ps1)" の SetExifInfo関数を流用するが、Exif情報は既に存在している事を前提とするため、ExifVersionを追加する処理(SetExifVersion関数の呼び出し)はコメントアウトする。
※ 過去記事:JPEG更新日時一括変更ツールを作る #6
# Exif情報登録 # $inputFileで指定したファイルに$dateTimeで指定したExif撮影日時を付加し$outputDirへ保存する。 # 保存したファイルのフルパスを返す。 function SetExifInfo($inputFile, $outputDir, $dateTime) { $image = New-Object System.Drawing.Bitmap($inputFile) # SetExifVersion -image $image SetDateTime -image $image -dateTime $dateTime $outputFile = Join-Path $outputDir (Split-Path $inputFile -Leaf) $image.Save($outputFile) $image.Dispose() return $outputFile }
更新日時変更
メイン処理よりExif情報変更(SetExifInfo関数の呼び出し)を行い。
関数の戻り値として、$outputDir へ保存したフルパスが返るので、このパスに対して更新日時の変更を行う。
この処理も、過去に作成した "JPEG更新日時一括変換ツール (ChangeJpegDate.ps1)" の メイン処理と同じである。
※ 過去記事:JPEG更新日時一括変更ツールを作る #6
※ 過去記事:PowerShell:ファイル更新日時の取得および設定
メイン処理は以下のようになる。
関数の戻り値として、$outputDir へ保存したフルパスが返るので、このパスに対して更新日時の変更を行う。
この処理も、過去に作成した "JPEG更新日時一括変換ツール (ChangeJpegDate.ps1)" の メイン処理と同じである。
※ 過去記事:JPEG更新日時一括変更ツールを作る #6
※ 過去記事:PowerShell:ファイル更新日時の取得および設定
メイン処理は以下のようになる。
$fileDate = (Get-ItemProperty -Path $file).LastWriteTime.AddMinutes($CorrectionValue) $outputFile = SetExifInfo -inputFile $file.FullName -outputDir $outputDir -dateTime $fileDate Set-ItemProperty $outputFile -Name LastWriteTime -Value $fileDate
※ 次回記事:JPEG時刻補正ツールを作る #2
次作プログラム, PowerShell, Exif
0 件のコメント:
コメントを投稿