2026年1月3日土曜日

写真 Exif White Balance の 21 って何?

写真に含まれる EXIF 情報。
便利なので、自作プログラムも作ってあります。
でも、最近、とあるファイルから情報取得し様として こけた! のです。
Exif White Balance の 21 って何?。


無論、自分で書いたプログラムの出来が悪いので、 こけた! 訳ですが ... 。


はい、 写真の EXIF 情報です。
例外発生して、処理が不味くて、ストンッ! と強制終了。


プログラミングに関しては、後述しますが、
原因は、Exif の White Balance でした。


もう随分と前に書いたプログラム、
  参考: JPG のメタデータを表示させる VB アプリ お披露目
      https://shiroyuki-mot-says.blogspot.com/2012/07/jpg-vb.html

CIPA:カメラ映像機器工業会 の仕様書等を参考に書いてあった訳ですが、

  参考; JPG アプリ作成時の参照規格
      https://shiroyuki-mot-says.blogspot.com/2012/07/jpg-ref.html
       (古い記述なので本文中の外部リンクは未確認)

今迄、大きなトラブルは少なかった記憶があるのですが、
今になって 不具合を露見!。


理由は、スマホで撮影された画像!。


恐らく、カメラ映像機器工業会には属してい無い筈なので、
独自拡張している為(?)、
プログラム内で用意している 値参照用のテーブルに無い値 が使われていて、
其れが原因で こけた! のでした。


ご存じかも知れませんが、
EXIF の White Balance は、通例、0 ~ 15 の 文字型数値 で格納されていた筈。
でも、21 が登場!。

Windows 11 Explorer や Exiftool では 自動 や Auto と表示されます。
いやぁ、参ったなぁ ... !。


21 を auto として、追加すれば、強制終了は無くなる筈。
でも、
どうして、修正前に、条件分岐が正常に働いて 例外 を処理出来ていないのか?。
無かったら、無い様に、対応していた筈なのに ... 。
変だなぁ~ ... 。


此処からは、プログラミングのお話です。
必要の無い方は 読み飛ばして 下さい。

環境は、Windows 7 時代 Visula Studio 2013 の VB.Net で書かれています。
こんな Code でした。
(別プログラム  WPF 版の .dll 用 Source Code から)

    Case Exif_Item.WhiteBalance_LS      'TagNo Dec37384 Hex"9208"
        valueTrans = IIf(listWhiteBalance.Keys.Contains(valueRaw), _
                         listWhiteBalance.Item(valueRaw), _
                         valueRaw & "(Unknown)")

此処で、
  valueRaw は 格納された文字型数値、
  valueTrans は 説明語句、
  listWhiteBalance は 値参照用のテーブル  SortedList(Of String, String) 。
  
If 文より、IIf 構文が好きで多用していましたが、
実行時、ある筈の無い値が入る事で、
範囲外の例外! を齎していたのです。
何の為の条件分岐だか分から無い ミス! でした。

修正後の Code 。
此れで、登録してい無い値(例えば 88)の場合 88(Unknown) 等と表示されます。

    Case Exif_Item.WhiteBalance_LS      'TagNo Dec37384 Hex"9208"
        If listWhiteBalance.Keys.Contains(valueRaw) Then
            valueTrans = listWhiteBalance.Item(valueRaw)
        Else
            valueTrans = valueRaw & "(Unknown)"
        End If

参照テーブル用に 新規に値を加える前 に、
此の様に、強制終了を起こさ無い様に、変更しました。


往時、スマホの写真データを扱う事は無く、サンプル用のデータも無かった為に、
バグが潜在化し、ミスに気付けなかった事になります。

物事を解析して組む 自前のプログラム の場合、
サンプルの収集が不十分だと、此の様な ミス があっても、
埋もれて仕舞い、気付け無い事になります。

其れにしても、流石に10年以上前のもの、
自分で書いた筈なのに、修正に右往左往。
昔の自分は まるで 他人さま の如し!。
Solution 構成やら参照関係 や Code 群 を 解読し無いと 前に 進めませぬ ... 。  :O

でも、此れで、少しは 延命 出来たかな?。  ;)



0 件のコメント:

コメントを投稿