zaki work log

作業ログやら生活ログやらなんやら

PowerShellで写真のExifから焦点距離・カメラ・レンズ情報を取得する

追記: カメラのモデル名とレンズも取得(後述)

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

このツイートを見かけて集計したら面白そうだなーと思ったのでやってみました。

指定ディレクトリ以下の全jpgファイルを~はまた今度…


Exif Tag一覧

cachu.xrea.jp

PropertyItem.Typeプロパティの値の型の定義の説明

dobon.net


環境 (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

PanasonicLUMIXシリーズのレンズのモデル名は42036で取得したけど、アプリによってはレンズ名取れないことが多いので、ほかのメーカーのレンズ名はtagが違うかもしれない。