列挙値を作る
このままでは面倒なので、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プロパティをキャストしてタグ名に変換して表示させている。
具体的に特定のタグを表示させてみよう。たとえば、撮影日だが、Exifでは、「DateTimeOriginal」タグを使う。PropertyItemsの各タグの値は、バイト配列になっている。「DateTimeOriginal」タグの値は、ASCII文字列値(これは、Exifの仕様書に記載されている情報)なので、バイト配列を文字列にキャストしてつなげてやればよい。具体的には、
($x.PropertyItems | Where id -eq ([EXIFTags]::DateTimeOriginal) | select -ExpandProperty value | % { [char]$_ }) -join ""
とする。
PropertyItemsから特定のタグをWhere-Object(エイリアスはWhere)で取り出して、valueプロパティを展開すれば、タグに対応した値のバイト配列が得られる。これを加工することでタグの値を得ることが可能だ
シャッタースピードは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に読み込んで、年ごとの撮影枚数を集計するなどといったこともできる。
本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
-
第531回
PC
Windowsのコンソール上でUnix/Linuxの標準的なコマンドを動かす「Windows CoreUtils」 -
第530回
PC
Windows 11でタスクバーの位置の移動機能が復活するのは結局どうなった? プレビュー版の現状を見る -
第529回
PC
Windowsの標準スクリプト言語であるPowerShellの現状をあらためて紹介する -
第528回
PC
Windows 11の標準機能でメモリに問題がないかを診断する -
第527回
PC
Windowsがクラッシュする原因を究明する方法 AIを活用すると結構早い -
第526回
PC
今年6月にPCが起動しなくなる心配はないが、セキュアブートが機能しないとWindowsのセキュリティ機能は一部使えなくなる -
第525回
PC
6月以降「PCが起動不可能に?」と間違った騒がれ方をしている原因の「セキュアブート」とは? -
第524回
PC
Windows Insider Programが変化 チャンネルが3つになって整理される -
第523回
PC
AI傾倒に一息入れて、既存のWindowsの改良を宣言するMicrosoft タスクバーを画面の上下左右に移動可能に!? -
第522回
PC
Windowsでも完全キーボード操作派は注目! PowerToysのコマンドパレット -
第521回
PC
Windowsでアプリをインストールしたときに警告が表示する「Defender SmartScreen」と「Smart App Control」 - この連載の一覧へ












