見出し画像

PowerShellで複数JPEGファイルからEXIF情報を取得してみた

撮影したアイドルの写真をXにポストする際、自分用の記録として撮影条件(焦点距離、F値、シャッタースピード、ISO感度)を併記している。これらの情報を確認するにはファイルのプロパティを見るか、画像処理ソフト等で確認する必要があり複数の写真があると結構大変である。それらの作業をPowerShellで自動化してみた。

  • まずは、ps1ファイルを用意する。中身は以下の通り。

Add-Type -AssemblyName System.Drawing

#焦点距離最小・最大
$min_fl=0
$max_fl=0
#F値最小・最大
$min_fv=0
$max_fv=0
#シャッタースピード最小・最大
$min_ss=0
$max_ss=0
#ISO感度最小・最大
$min_ps=0
$max_ps=0

#ドラッグ&ドロップされたすべてのJPEG画像を処理する
$Args | foreach{
    $item = Get-Item -LiteralPath $_

    # 画像読み込み
    $tmp = "ファイル名:" + $item.FullName
    Write-Output $tmp
    $img = New-Object Drawing.Bitmap($item.FullName)

    #焦点距離(FocalLength)
    $c=($img.PropertyItems | ? id -eq 37386 | select -ExpandProperty value )
    $fl=([System.BitConverter]::ToInt32( $c,0)/[System.BitConverter]::ToInt32( $c,4))
    Write-Host "焦点距離 :${fl}mm"
    if (($fl -ilt $min_fl) -Or ($min_fl -eq 0)) {
        $min_fl=$fl
    }
    if ($fl -gt $max_fl) {
        $max_fl=$fl
    }

    #F値
    $c=($img.PropertyItems | ? id -eq 33437 | select -ExpandProperty value )
    $fv = ([System.BitConverter]::ToInt32( $c,0)/[System.BitConverter]::ToInt32( $c,4))
    Write-Host "F値    :$fv"
    if (($fv -ilt $min_fvJ) -Or ($min_fv -eq 0)) {
        $min_fv=$fv
    }
    if ($fv -gt $max_fv) {
        $max_fv=$fv
    }

    #シャッタースピード
    $c=($img.PropertyItems | ? id -eq 33434 | select -ExpandProperty value )
    $ss1=[string][System.BitConverter]::ToInt32( $c,0)
    $ss2=[string][System.BitConverter]::ToInt32( $c,4)
    Write-Host "SS    :$ss1/$ss2"
        if (($ss2 -ilt $min_ss) -Or ($min_ss -eq 0)) {
        $min_ss=$ss2
    }
    if ($ss2 -gt $max_ss) {
        $max_ss=$ss2
    }

    #ISO感度
    $c=($img.PropertyItems | ? id -eq 34855 | select -ExpandProperty value )
    $ps=[System.BitConverter]::ToInt16( $c,0)
    Write-Host "ISO感度  :$ps"
    # Write-Output $tmp
    Write-Host ""
    if (($ps -ilt $min_ps) -Or ($min_ps -eq 0)) {
        $min_ps=$ps
    }
    if ($ps -gt $max_ps) {
        $max_ps=$ps
    }
}

#Xポスト用文字列出力
if ($min_fl -eq $max_fl) {
    Write-Host -NoNewline "${min_fl}mm"
}
else {
    Write-Host -NoNewline "${min_fl}-${max_fl}mm"
}
Write-Host -NoNewline ", F$min_fv"
if ($min_fv -ne $max_fv) {
    Write-Host -NoNewline "-$max_fv"
}
Write-Host -NoNewline ", 1/$min_ss"
if ($min_ss -ne $max_ss) {
    Write-Host -NoNewline "-$max_ss"
}
Write-Host -NoNewline ", ISO$min_ps"
if ($min_ps -ne $max_ps) {
    Write-Host -NoNewline "-$max_ps"
}
#何かキーが押されるまで待つ
Cmd /c pause | Out-Null
  • ファイル名は何でもよいが、ここでは「EXIF.ps1」とする。

  • 「EXIF.ps1」と同じフォルダに「EXIF.ps1」のショートカットを作成する。ショートカットのファイル名も任意だが、ここでは「EXIF」とする。

  • ショートカットのプロパティを開き、ショートカットタブのリンク先の先頭に以下を追加する(最初から記載されているps1ファイルのリンク先は削除してはいけない)。

powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File 
ps1ファイルとショートカット
ショートカットのリンク先
  • 処理対象のJPEGファイルをショートカットにドラッグ&ドロップする。

使い方
  • 処理結果が表示される。任意のキーを押下すればウィンドウが閉じる。

処理結果

この記事が気に入ったらサポートをしてみませんか?