追記: カメラのモデル名とレンズも取得(後述)
param($file) [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing") $image_exif = New-Object System.Drawing.Bitmap($file) # 35mm換算焦点距離のExif Tagは41989 $flen_values = ($image_exif.PropertyItems | Where-Object { $_.Id -eq 41989 }).Value # 35mm換算焦点距離はType=3(16bit整数の配列)と決め打ちで処理 $flen35 = $flen_values[0] + $flen_values[1]*256 echo $flen35 $image_exif.Dispose()
これで35mm換算焦点距離を取得できる。
35mm換算前の値であれば37386
を使う。
実行例
PS C:\Users\zaki\src\powershell\forcus-length> .\sample.ps1 .\sample28.jpg 28 PS C:\Users\zaki\src\powershell\forcus-length> .\sample.ps1 .\sample600.jpg 600 PS C:\Users\zaki\src\powershell\forcus-length> .\sample.ps1 .\sample40.jpg 40
このツイートを見かけて集計したら面白そうだなーと思ったのでやってみました。
昨晩、12-100mm f4で、自分がどの焦点距離をよく使っているのか調べた。
— SAKAI Yasuharu (@sakay_y) 2020年1月24日
WSLのUbuntuにimagemagickを入れて以下のコマンドでCSV吐いて、Excelで集計した結果。
find <ディレクトリ> -name \*.JPG | xargs -I {} identify -format "%[filename],%[exif:FocalLengthIn35mmFilm]" {} >> hoge.csv pic.twitter.com/jMarX2op3L
指定ディレクトリ以下の全jpgファイルを~はまた今度…
Exif Tag一覧
PropertyItem.Typeプロパティの値の型の定義の説明
環境 (Win10 x64)
PS C:\Users\zaki\src\powershell\forcus-length> $PSVersionTable Name Value ---- ----- PSVersion 5.1.17763.771 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.17763.771 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1
追記
カメラのモデル名とレンズも取得
param($file) [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing") $image_exif = New-Object System.Drawing.Bitmap($file) # 35mm換算焦点距離のExif Tagは41989 $flen_values = ($image_exif.PropertyItems | Where-Object { $_.Id -eq 41989 }).Value # カメラ $model_values = ($image_exif.PropertyItems | Where-Object { $_.Id -eq 272 }).Value # レンズ $lens_values = ($image_exif.PropertyItems | Where-Object { $_.Id -eq 42036 }).Value if ($lens_values -eq $null) { $lens_values = ($image_exif.PropertyItems | Where-Object { $_.Id -eq 50736 }).Value } # 35mm換算焦点距離はType=3(16bit整数の配列)と決め打ちで処理 $flen35 = $flen_values[0] + $flen_values[1]*256 echo $flen35 # カメラのモデル名 $model = [System.Text.Encoding]::ASCII.GetString($model_values) echo $model # レンズ $lens = [System.Text.Encoding]::ASCII.GetString($lens_values) echo $lens $image_exif.Dispose()
実行例
PS C:\Users\zaki\src\powershell\forcus-length> .\sample.ps1 .\sample600.jpg 600 DC-GX7MK3 LUMIX G VARIO 100-300/F4.0-5.6 PS C:\Users\zaki\src\powershell\forcus-length> .\sample.ps1 .\sample50.jpg 50 DMC-GX7MK2 LEICA DG SUMMILUX 25/F1.4 PS C:\Users\zaki\src\powershell\forcus-length> .\sample.ps1 .\sample200.jpg 200 DMC-GX7MK2 LUMIX G VARIO 35-100/F2.8
※ PanasonicのLUMIXシリーズのレンズのモデル名は42036
で取得したけど、アプリによってはレンズ名取れないことが多いので、ほかのメーカーのレンズ名はtagが違うかもしれない。