便利なので、自作プログラムも作ってあります。
でも、最近、とあるファイルから情報取得し様として こけた! のです。
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 件のコメント:
コメントを投稿