WindowsのPowerShellで画像ファイルのExif情報を扱う
ASCII.jp / 2023年5月28日 10時0分
デジカメの画像ファイルをエクプローラーのプロパティで見ると、撮影日時などの情報が表示される。
![](https://ascii.jp/img/2023/05/27/3543073/x/e3e9cd5374722585.png)
これは、画像ファイル中のExif(Exchangeable image file format)情報などを取り出しているものだ。.NET Frameworkにも、こうした画像の情報を扱う機能があり、PowerShellから簡単にアクセスができる。ただし、Windowsは内部的には、Exifファイルを解析しているものの、すべての情報を出力することができない。それでも撮影日など主要な情報に関しては、取得することか可能だ。
画像ファイルのプロパティを取得
画像ファイルからプロパティ情報を取得するには、System.Drawing.Bitmapクラスを使う。PowerShellならそのままオブジェクトを作ればよく、Windows PowerShellならば、Add-Typeで「System.Drawing」アセンブリを読み込む。画像ファイルを指定してSystem.Drawing.Bitmapを作ったら、「PropertyItems」プロパティを表示すればよい。
add-type -AssemblyName system.Drawing # Windows PowerShellのみ必要 $x=New-Object System.Drawing.Bitmap(".\Sample01.JPG") $x.PropertyItems
![](https://ascii.jp/img/2023/05/27/3543074/x/c58c536101e11cb7.png)
このPropertyItemsには、Exif 2.1で定義されたもののほかに、JPEG由来のものなど、画像ファイルから得られる情報が含まれている。ただ、残念なことにこのプロパティの出力するIdは整数のみで、Exifのどのタグかは表示されない。
Id番号からExifのタグ名を探せばよいのだが、それには、別途ドキュメントを見る必要がある。Windowsでは、このプロパティは、GDI+が扱っているため、Microsoftのサイトに情報がある。
●Imageプロパティのタグ定数 https://learn.microsoft.com/ja-jp/windows/win32/gdiplus/-gdiplus-constant-image-property-tag-constants
ただし、これはGDI+での定義であり、Exifのタグ名とは若干の違いがある。この定義で「PropertyTagExif」で始まるものは、Exif 2.1由来のタグであるが、一部先頭が異なるものがある。たとえば、デジカメのメーカーを示すExifの「Make」タグは、「PropertyTagEquipMake」になっている。なお定義はWindowsのSDK(Windows Kit)に含まれる「Gdiplusimaging.h」に記述されている。これを入手するには、Windows Kitをインストールする。
また、Exifは仕様書が公開されており、PDFなどで入手が可能である。現在の公式版は、Exif 2.32である。
●CIPA DC-008-2019 デジタルスチルカメラ用画像ファイルフォーマット規格 Exif 2.32 https://www.cipa.jp/std/documents/download_j.html?DC-008-2019-J
ただし、Exif 3.0が完成しており、原稿執筆時点では意見受付期間中としてドラフト版が公開されている。残念ながら、期限が終わりに近いので公開が止まっている可能性もある。
●CIPA 一般社団法人カメラ映像機器工業会: CIPA規格 WTO/TBT60日公開 https://www.cipa.jp/j/std/draft.html
列挙値を作る
このままでは面倒なので、Exif仕様書(Ver.3.0)とGdiplusimaging.h(Build 22621用)からPowerShellの列挙値(enum)の定義を行なうファイルを作った。大きなものなので、ここでは掲載しないが、筆者のGitHubページ(https://github.com/ShinjiShioda/Exif-PS)にリポジトリを作ったので、適当に利用してほしい。
作成したPowerShellファイルは2つ。EXIFのタグはEXIFTags.ps1、GDI+のタグはGDIPImageTags.ps1である。どちらも、ローカルに置いたら、ドットソースコマンドで現在のセッションに読み込む(先頭のピリオドがコマンドである)。
. .\EXIFTags.ps1 . .\GDIPImageTags.ps1
それぞれ、値を使うには、「[EXIFTags]::<タグ名>」「[GDIPImageTag]::<タグ名>」とする。これは、実際には、32bit符号なし整数になっている。タグ名に関しては、補完が可能なので、先頭部分を適当に入れてタブキーを押す。
逆に数値をenum値としてタグ名を表示させたい場合には、対象の数値にキャストを行なう。前記の実行例で$xにJPEG(Exif)ファイルのbitmapオブジェクトが入っている場合、
$x.PropertyItems | select id, @{Name="TagName"; Expression={[EXIFTags]$_.Id} },@{Name='GDIPTagName'; Expression={[GDIPImageTag]$_.Id } } ,Value
で、Exifタグ、GDI+タグ名で表示できるようになる。select-object(エイリアスがselect)では、ハッシュ値でNameとExpressionを定義すると、その場で計算したプロパティ値を表示できるようになる。ここでは、読み込んだ列挙値でIdプロパティをキャストしてタグ名に変換して表示させている。
![](https://ascii.jp/img/2023/05/27/3543075/x/de15213bee75363b.png)
具体的に特定のタグを表示させてみよう。たとえば、撮影日だが、Exifでは、「DateTimeOriginal」タグを使う。PropertyItemsの各タグの値は、バイト配列になっている。「DateTimeOriginal」タグの値は、ASCII文字列値(これは、Exifの仕様書に記載されている情報)なので、バイト配列を文字列にキャストしてつなげてやればよい。具体的には、
($x.PropertyItems | Where id -eq ([EXIFTags]::DateTimeOriginal) | select -ExpandProperty value | % { [char]$_ }) -join ""
とする。
![](https://ascii.jp/img/2023/05/27/3543076/x/8722d00c93ae9013.png)
シャッタースピードはExposureTimeタグであり、値はint32値が2つの分数(RATIONAL。有理数)である。バイト配列をいったん変数$cに入れておき、BitConverterでint32に変換する。
$c=($x.PropertyItems | ? id -eq ([EXIFTags]::ExposureTime) | select -ExpandProperty value ) [System.BitConverter]::ToInt32( $c,0) [System.BitConverter]::ToInt32( $c,4)
最初のものが分子、2つめが分母である。サンプル画像では「10」と「2500」なので、10/2500=1/250秒である。
画像ファイルからの情報取得は、コマンドラインでも意外に簡単にできる。このため、大量の画像ファイルから、撮影日だけを取り出すといったことも容易だ。CSVファイルに出力すると、全画像ファイルの撮影日をExcelに読み込んで、年ごとの撮影枚数を集計するなどといったこともできる。
この記事に関連するニュース
-
MicrosoftがPowerToys向け新しい「新規作成」モジュール開発中
マイナビニュース / 2024年6月26日 10時46分
-
Windowsが今更(?)開発者に優しくなろうとしている!? 「Dev Home」は開発者にとって使い物になる?
ASCII.jp / 2024年6月23日 10時0分
-
ユーザー自らマルウェアをインストール、偽の警告メッセージに注意
マイナビニュース / 2024年6月19日 8時26分
-
2006年以来のメジャーリリースとなるPython科学計算用ライブラリ「NumPy」v2.0.0
マイナビニュース / 2024年6月19日 7時52分
-
「Copilot+ PC」って何だ!? 「AI PC」は早くも第2世代へ
ITmedia PC USER / 2024年6月18日 6時0分
ランキング
-
1「赤ちゃんのお世話がしたいニャ!」ベビーサークル越しに愛を訴える猫ちゃん
おたくま経済新聞 / 2024年7月8日 7時0分
-
2一度植えたら、自動で増殖&毎年収穫を目指せる野菜5種とは? 自然農のエキスパートが伝授する方法に反響
ねとらぼ / 2024年7月8日 9時0分
-
3「どう見てもセガのアレ」 コンビニうどんの容器トレーが「圧倒的既視感」「コントローラーの抜け殻」と話題
ねとらぼ / 2024年7月7日 17時0分
-
4モトローラが日本市場で急成長している理由 1年で出荷台数2倍以上、「edge」「razr」の販路拡大がカギに
ITmedia Mobile / 2024年7月6日 11時45分
-
5「わろてる」 人気VTuberが部屋で“でかめのやらかし”をした様子を公開し話題に 「どうなってんのこれw」「想像以上」
ねとらぼ / 2024年7月7日 18時0分
記事ミッション中・・・
記事にリアクションする
![](/pc/img/mission/mission_close_icon.png)
記事ミッション中・・・
記事にリアクションする
![](/pc/img/mission/point-loading.png)
エラーが発生しました
ページを再読み込みして
ください
![](/pc/img/mission/mission_close_icon.png)