2016年11月26日土曜日

VB 写真情報の操作を WPF で

Windows.Forms で Visual Basic を覚えた身としては、 新しい器に WPF を選んだのは 誤算 が多かったです。
まぁ、 何とか書けるだろッ!、 と思って始めた この作業。
いやぁ、 立ち塞がる 山々 の険しい事!。  例えば、 dll
EXIF のハンドリング用の dll も既に書いてある事だし ... 、 と思って書き出したのに ... 。


そうなのです。
写真のシステムを組むに当たって、 既に、 Visual Basic 2008 SP1 Express Edition で、
写真のメタデータを扱う dll を書いてありました。
これは、 Windows.Forms が前提で System.Drawing.Imaging.PropertyItem の機能でメタデータを取得していました。
無論、当時は .Netframework 3.51 です。

その後、 Visual Studio 2013 Community Update 5 を導入し、
該当ライブラリ dll は、
.Netframework 4 系に対応させ、 多少の手直しをしたものの、 基本は変わりませんでした。

そして、 今回の 大改革 を迎えた訳です。
そう、 写真の情報(メタデータ) を扱うものとしては 3代目 に当たります。.


今回、最初は、 2代目の dll を使って作ろうとしましたが、
知識不足で、 上手く動いてくれません!。
WPF に Forms のクラスをベースに書いた dll を持ち込むのも 抵抗 があって、
動く様にする 努力を重ねる のは諦め、
方針転換と相成りました。
餅は餅屋! で、 WPF の技術を使った方法に切り替える 様に舵を切るしかなかった のです。


WPF ですから、  GDI+ 前提の System.Drawing. は基本的に対象外です。
WPF のグラフィックス廻りをサポートするのは Presentation.Core の System.Window.Imaging ですね。

System.Drawing.Imaging.PropertyItem に相当するのが
System.Window.Imaging.BitmapMetadata になります。

各クラスのプロパティや構造や思想は違いがあり、
単純に組み替えでは済みませんでした。


そうして、 何とか、必要最低限の 読み出し機能を実装した、 dll 用の Class を でっち上げました。

少し、その さわり を。


こんな感じで動いています。

通常 、 EXIF 項目は 番号 でアクセスする 説明・解説 が多いですが、
直観的ではないし、 書き間違いも バグ の温床になる気がしていたので、
Enum 化して、 名前でアクセスする様に工夫しました。

  上の図は 何とか形にして動いた時の 画面イメージ です。
  勿論、それから、色々と手を入れ ... 。  手持ちの .jpg で問題ない様に詰めていますが ... 。.

    あっ、 因みに、 画面にある Flash モードは 強制発光 で 発光していない を示します。
    例えば、 自動発光 で 発光したか しないか も分かる様になっているのですね、 EXIF データは。
    Exp (撮影モード) も 実は色々ありますが ... 。
    取得出来たり出来なかったり ... まぁ、その辺りは ... メーカー独自仕様と言う事で ... 。 
    そうそう、 日付が / 区切りで無く :: 区切り なのは 昔からですね。  変なの!。

    以前の経験があるから書けるので、 最初から、この課題に取り組むと、相当苦労する気がします。 
    EXIF の仕様を 多少は 理解していないと、使い物にならない Class が生まれそうです。 .


「必要最低限」 と書いたのには理由があります。 *1.
2代目の Class では 全項目を扱う事が可能でしたが、
今回の Class では 事前に EXIF (含む XMP/ITPC) 項目の 番号と内容 を把握していないと いけない のです。
Enum 化した事で、 定義していない 項目にアクセスする のは不可能です。
どんな項目が そのファイルに記述されているか、 シラミ潰し に探す のは難しい です。
MakerNote を除く 主要項目には 対応しましたが、 これが 残念な処 です。  依って、名称は xxx_min です。. *1.end.


dll 化 に当たっては、
               VB WPF 用の dll を作る
を参照下さい。
また、 dll 化すれば、 Assembly Name 等は変わって来るでしょうから、 利用する上で その点は留意 ですよ。



[2016/11/26] 必要最低限 に関して追記 *1. 以下のブロック

0 件のコメント:

コメントを投稿