概要

MS Access には、画像処理用のライブラリがありません。

もちろん表示だけならイメージ コントロールや連結/非連結オブジェクト フレームを使えば済む話です。

そもそもクライアント向けパーソナル DB 製品に高度なグラフィック処理機能を求めるのはお門違い、という意見も昔から根強いわけで、これが正論である点には何の異議もありません。

しかし一方で、DB 連携クライアントツールとして最も広く普及した MS Access にとって、データを取ってきて表形式で表示できればそれでよしとされた無邪気な時代がとうに終わりを告げているのもまた事実です。エンドユーザーから見れば、使うツールの種類などどうでもいい話で、それが業務に必要であれば IE も Acrobat Reader も MS Access も横一線の同じ道具でしかありません。そのとき、MS Access が組み込み機能として備える貧弱な画像処理能力は、何の違和感もなく Flash や AJAX、Photoshop や Silverlight との比較に晒されることになります。

Google マップでさー、マウスでドラッグして地図を移動したり、ホイールでズームしたり、クリックでマーカー付けたりできるじゃない。あんな感じの機能がほしいんだけど

と言われたら、どうしますか?

A) んー、Access じゃあ ちょっと無理じゃないですかねぇ

まあ、それもひとつの答えです。問題ありません。

でも、実はこう返すこともできるんです。

B) よろしい、ならば clGdiPlus

今回は、VBA 用の画像処理クラス clGdi32clGdiPlus をご紹介します。

そして A の答えを選んだ方は、高度な画像処理が Access に無理なのではなく、このクラスを知る前の自分に無理だっただけだということに気づくでしょう。

clGdi32 と clGdiPlus とは何か

clGdi32clGdiPlus は、ともに VBA 用の画像処理クラスです。

作者は arkham46 氏。

2009/08 時点では、以下が最新バージョンとなっています。

ClassVersionReleased
clGdi32v0.62009/07/15
clGdiPlusv1.02009/07/15

クラス名から察しがつくように、clGdi32 は GDI (gdi32.dll) を、clGdiPlus は GDI+ (gdiplus.dll) を VBA 用に公開するクラスです。

もちろん、各 DLL が公開する API (Windows GDI API または GDI+ Flat API) を個別に直接呼んでも構いませんし、ピンポイントで使用する場合はむしろそのほうが望ましい状況も有り得るでしょうが、多くの場合それらを一から実装するのは手間のかかる作業になりがちです。VBA 用にラッピングされたクラスを使うことで、その手間が大幅に軽減されることが期待できます。

このクラスを使って何ができるかを説明しようとすると膨大なリストになるので、画像処理ならほぼ何でもできると言っておくほうがおそらく話が簡単でしょう。

画像のスケーリング、トリミング、色の補正、合成、マスキング、線・図形・テキストの描画、当たり判定等々はもちろんのこと、clGdiPlus では GDI+ を利用してデジカメ画像等の Exif 情報を読み書きしたり、画像形式の変換までサポートします。

後方互換性や MS Access 以外のアプリケーションでの使用に配慮していることも特徴のひとつです。

Access 95 から 2007 に至るまで網羅し、クラスモジュール先頭の条件付きコンパイル定数の設定値を変更するだけで Excel (clGdi32 の場合はユーザーフォームをサポートするすべてのアプリケーション) でも使用できるようになります。そのため、利用範囲が非常に広いといえるでしょう。

もうひとつの特徴として、ドキュメント類が豊富なこともあげることができます。

この種のオープンソースによるクラスは、ドキュメントが貧弱(あるいは無い)でソースコードを追わないと使い方が分からないものも少なくありませんが、本クラスには豊富なサンプルと丁寧に解説されたチュートリアルが多数、そして全メンバを網羅したヘルプがオンラインで提供されています。デモサンプルの中には Exif 情報を表示する実用的なものからブロック崩し、パックマン、果てはグラディウス風のスクロール型シューティングゲームまで含まれており、これを見た YU-TANG が思わず最大の賛辞を口走ったというほどの充実ぶりです。

samples

ライセンスは特に明記されていませんが、これは意図的なもののようです。

arkham46 氏に尋ねたところ、ライセンスを決めるつもりはない。自由に改変や再頒布してかまわないと語っていました。

どちらを使えばよいか

クラスの機能は、基本的には依存する dll の機能を反映しています。そのため、GDI+ をベースとする clGdiPlus の方が高機能です(必ずしも高速ではありません リンク1 リンク2)。

GDI ベースとなる clGdi32 には、後に GDI+ で拡張された Exif 情報の入出力機能や JPEG や PNG のサポート、アニメーション GIF の制御機能等が欠落しています。

しかし画像の基本描画機能に限れば、両者に大きな差はありません。

最大の違いは、gdiplus.dll を必要とするか否か、です。

gdi32.dll は Windows 95 以降の全 OS に標準搭載されています。したがって、clGdi32 はクラスモジュールをインポートするだけでよく、他に配布が必要なファイルはありません。

一方、gdiplus.dll は Windows XP 以降の OS に標準搭載され、Office XP 以降のバージョンに同梱されていますが、それより前の環境では gdiplus.dll が存在しない可能性があります。

以下に、gdiplus.dll が確実に存在するかどうかの一覧を掲載します。

gdiplus.dllOffice
  95    97   2000 XP
(2002)
 2003  2007 
WindowsME 以前×××
2000×××
XP
Vista

○ GDI+ が確実に存在する

× GDI+ が存在するとは限らない

― サポート外(通常この組み合わせは使用されない)

発売順でいえば「ME 以前」の中に Windows 2000 も含まれますが、上の表では便宜的に「ME 以前」として Windows 2000 以外の OS (98SE や NT 4.0 等) をまとめています。また Windows 95 以前は GDI+ 自体が動かないようなので、表自体の対象外とします。

サポート外の組み合わせは論外なので気にしないとして、○が付いている組み合わせは OS または Office のバージョンによって GDI+ が確実に存在すると思われる環境です。したがって、これらの環境をターゲットとする場合は、clGdiPlus を使用しても特に他のファイルの配布は必要ありません。

一方、上の表において×が付いている組み合わせは GDI+ が存在するとは限らない環境です。あいまいな言い方になるのは、GDI+ がさまざまなアプリケーションに同梱されているため、それらのインストールしだいではシステムディレクトリやパスが通っているどこかのディレクトリに gdiplus.dll が存在するかもしれないからです。これらの環境がターゲットに含まれる場合は、clGdiPlus を使用するなら gdiplus.dll も配布する必要があるかもしれません。

必要に応じて、どちらのクラスを使用するか決めるとよいでしょう。

再頒布可能な gdiplus.dll は、正規の Windows ユーザーであれば誰でも下記から入手することができます。

Platform SDK Redistributable: GDI+

上記ダウンロードページの Supported Operating Systems 欄を見ると Windows 98 や NT 4.0 が載っていませんが、GDI+ 自体は Windows 98 や NT をサポートしているはずです。おそらく OS のサポートが終了しているので、載せていないのでしょう。

ダウンロードしたファイルをダブルクリックすると解凍されます(解凍先のフォルダを訊かれます)が、解凍後のフォルダにいろいろ入っているので迷うかもしれません。必要なのは、[asms]-[10]-[msft]-[windows]-[gdiplus] の下にある gdiplus.dll だけです。これを MDB ファイルと同じフォルダか Office ディレクトリ(MSACCESS.EXE と同じ場所)、または OS にパスの通っているどこかに置けば使用できます。

なお arkham46 氏の公開している画像処理用クラスにはもうひとつ、clImages クラスがありますが、これはすでに開発を終了している古いライブラリです。これの後継が clGdi32 になります(clGdiPlus にインターフェイスを合わせて再実装している)。間違って古い clImages クラスを選ばないようご注意ください。

サンプルを日本語版 MS Access 上で使用する際の注意点

さて、すでに arkham46 氏のサイトを訪れた方はご存知のように、オリジナルはフランス語です。

まあ Web サイトは翻訳サービスを通せば済む話ですが、YU-TANG が確認したところ、言語の違いのせいで日本語版の MS Access 上ではサンプルが動作しないことが分かりました (クラスモジュール自体には問題ありません。あくまで MDB ファイルの問題です)。

そこで、日本語版の MS Access 上で使用する際に問題になると思われる箇所を修正したサンプルを以下で配布します。

追記

2009/8/14 付けで、各サンプル同梱の clGdiPlus または clGdi32 を最新版に更新しました。

本家サイトには、リボンにアニメーション GIF を表示するサンプルも追加されていますが、YU-TANG が 2007 を使用していないため、日本語版は提供していません。

最新モジュールは本家サイトよりダウンロードしてください。

一部のサンプルも日本語版で動作するよう修正しましたので、arkham46 氏の許可を得てこちらも配布します。

ダウンロードは以下からどうぞ。

※ jeudetir_access.zip の攻撃は Control キーです。自分はしばらく気づかなかったので、念のため。

なおバグ報告や要望等がある方は、可能であればフランス語か英語で arkham46 氏にコンタクトを取ってください。

あるいはご意見フォームまでお寄せいただければ、YU-TANG があるていど取りまとめて伝言します。

謝辞

すばらしいサイトを公開している arkham46 氏にお礼申し上げます。

Merci beaucoup, Thierry!

関連情報

clGdiPlus のオンライン リファレンスの日本語訳に関しては、下記を参照してください。

clGdiPlus クラス リファレンス

※ V0.6 用です。V0.7 で追加された関数は載っていません。

clGdi32 のリファレンスの翻訳はありませんが、インターフェイスは clGdiPlus に極力合わせているため、上記リンクであるていどの代替にはなるはずです。

clGdiPlus を利用して、通常のイメージ コントロールにアニメーション GIF を表示する方法については、本サイト内の下記関連トピックを参照してください。

フォームにアニメーション GIF を表示する方法

API 自体については、以下の msdn を参照してください。

Windows GDI

GDI+

GDI+ に関しては日本語の資料が非常に少ないのですが、GDI+ のマネージドクラスであるところの .NET Framework クラス ライブラリの System.Drawing 名前空間に関しては日本語版の msdn が提供されているので、こちらを参考にする手もあります。

System.Drawing 名前空間

更新履歴