今回は、Windowsの標準画像であるビットマップを扱う、プログラムを公開します。ビットマップファイルを読み込み、画素データ(RGB)を取得する内容となっています。単純に画像データを読み込むだけでは、少しつまらないので、簡単な画像処理として、グレースケール変換も実装しています。ありきたりの画像も、モノクロのグレースケールに変換すると、味わい深い画像に変化する場合もありますよね。今回は、そんな感じのサンプルです。
ソースコードが以下からダウンロード出来ますので、参考にしてみてください。ソースコードは、Microsoft社の製品 エクセル向けに書いたものなので、利用するには、ご使用のコンピュータに、エクセルがインストールされていることが、必須条件です。
BMPファイルの仕様について、簡単に説明します。ビットマップのファイル構造を示すと以下のようになり、大きく分類すると4つの構造に分けることが出来ます。
MSDNの情報も参考にしてみてください。MSDN:ビットマップストレージ
分類された4つには、画像に関する以下の情報が記述されています。
これらをそれぞれ説明すると以下の通りとなります。
ファイルの先頭の2バイトには、ビットマップを表す、BM(文字コード:&H42、&H4D)が保存されており、それを含めたビットマップファイルヘッダ情報と、ビットマップ画像のヘッダ情報の2つのヘッダ情報が、先頭から続けて、保存されています。これは、StructBitmapFileHeader構造体とStructBitmapInfoHeader構造体により、定義されています。但し、VBAにおいては、C言語と違って、パッキング(構造体の隙間を詰める)が不可能なため、データを取得する際には、注意が必要です。詳細については、VBAプログラム豆知識の『構造体の隙間』の章を参照してください。また、各構造体についての詳細な情報はソースコードを参照してください。
次に、色数に応じて、カラーパレット情報群が保存されていますが、これは、ビットマップの色数が24ビットの場合には、省略(サイズが0)されます。256色の場合は、StructRgbQuad構造体のサイズ(4バイト)×256個。16色の場合は4×16個のサイズ分、カラーパレット情報が記述されています。
最後に、カラーインデックス情報群ですが、これは24ビットの場合、R(1バイト)、G(1バイト)、B(1バイト)の画素情報が、画素数分(幅×高さ)保存されています。256色の場合は、カラーパレットを示す値が1バイトずつ、16色の場合は、4ビットずつ画素数分保存されています。このインデックス値が、カラーパレット情報群の色情報を指し示しています。
尚、ビットマップにおいては、このカラーインデックス情報は、画像の下端の左端から、図のような順番で保存されていますので、注意してください。
今回は、ビットマップ画像の読み込みについては、実装していますが、ファイルへの書き込みには対応していません。ですので、書き込み処理の実装に挑戦してみては如何でしょうか?
作者は、本ソフトウェアの使用または使用不能から生じるコンピュータの故障、情報の消失、その他あらゆる直接的及び間接的被害に関して一切の責任を負いません。
サンプルに含まれるデータは、私の創作によるものです、サンプルデータに含まれる個人名、会社名などの情報は、実在の人物とはまったく関係ありません。
ご使用にあたり、改善の要望、不具合の発生等ありましたら、画面下のアドレスまで、ご連絡頂きますよう、宜しくお願いいたします。ご面倒、ご不便をお掛けしますが、宜しくお願いいたします。