VBAで2次元配列データからビットマップ(BMP)画像を生成する

ビットマップ(.bmp)画像は内部構造がシンプルで、一部のデータを除けば基本的にすべてがRGBデータで構成されています。この特性を活かし、VBAの処理だけでビットマップ画像をゼロから生成することが可能です。単独でこの機能を利用する機会は少ないものの、Windows APIを併用することで、スクリーンのRGB値を一括で取得できるため、画面キャプチャ機能を実装することができます。

BMP画像のファイル構造

ビットマップは大きく分けると「ヘッダー部」「データ部」の2つで構成されています。このとき、バイナリデータの先頭から54byte分のデータがヘッダー部となっており、ヘッダー部以降の全てのデータがデータ部となっています。ヘッダー部にはこのファイルがビットマップであることや、画像の高さや幅、色数などの情報が格納され、データ部には各ピクセルのRGB値が順に格納されています。

 
icon-edit ヘッダー部

VBAでヘッダー部を定義するためにはBITMAPFILEHEADER構造体およびBITMAPINFOHEADER構造体を用意します。Openステートメントの「For Binary」で開いたファイルにこれら構造体を書き込めばビットマップファイルのヘッダー部の定義ができます。(※上画像でいうHeaderとInfoHeader)

 
icon-edit データ部

VBAでデータ部を定義するためにRGBTRIPLE構造体を用意します。Openステートメントの「For Binary」で開いたファイルに対して前項のヘッダー情報を書き込んだ後にこの構造体の配列を入力することで、ビットマップファイルのデータ部の定義ができます。(※上画像でいうColorTable)

データ部の色情報は画像の上下が反転されるため、ファイル書き込み時には注意する必要があります。また、画像の各行のRGBデータは4byteの倍数(32ビットの境界)とする必要があります。たとえば 画像幅が5ピクセルの場合は15byte(=RGBの3byte×5ピクセル)となりますがこれは4の倍数に1byte分不足しているため、その部分には空の1Byteデータを入力して境界を調整する必要があります。これを行わないとピクセル情報に”ズレ”が発生してしまい正しくビットマップを表現することができません
 

BMP画像生成コード

コード内でRGBTRIPLE構造体の配列データからビットマップ画像を生成するサンプルコードは下記のとおりです。出力パスを任意のパスに設定した後、下記コードを実行すると  のような2×2ピクセルのビットマップ画像を出力することができます。(※同名ファイルが存在する場合は上書き)

コード解説

ビットマップの色定義

ピクセルの色情報はRGBTRIPLE型のrgbImgData配列で定義されているため、配列の要素数を増やして各要素のRGB値を設定しておけば任意の画像を生成することができます。rgbImgData配列は2次元配列になっており、各要素のRGB値を適用するピクセルは下図の通り左上から順に設定していきます。

これにより i 行 j 列目のピクセルの色を指定したい場合は rgbImgData(i,j) のRGB要素を設定するだけでビットマップの色指定が行えます。ビットマップの色情報をこのようなRGB情報を持った構造体の2次元配列データとしておくことで、指定のピクセルの色情報へ簡単にアクセスすることができ、出力だけでなくグレースケール化や画像の回転などの画像処理も簡単に行うことができるようになります。
 

ビットマップ出力

ビットマップを出力するには下記の手順を行います。

① ヘッダー部の定義 (BITMAPFILEHEADER/BITMAPINFOHEADER構造体の定義)
② Openステートメントの「For Binary」でヘッダー部、データ部の順に書き出し

 
ヘッダー部の情報は基本的にはすべて定数値になるため、下記の通り記載しておけば問題ありません。画像の幅と高さの情報は前項で定義した2次元配列の要素数から取得することができます。

 
ヘッダー部の定義ができたらOpenステートメントでバイナリファイルを作成し、先行してヘッダー部を出力します。その後、前項で定義した2次元配列の各要素を順に出力していきます。このときビットマップの構造上、画像の上下を反転させるために行の出力順は反転させる必要があります。また、行のバイト数が4の倍数となるように空のByteを入力する処理も入れる必要があります。

関連情報

icon-share-square VBA×画像処理ページ

VBAでBMP画像を読み込みExcel上でドット絵を作成する方法

icon-share-square 参考

外部リンク:【バイナリエディタ】BMP画像のファイル構造を解析

Excel, VBA, 画像処理

Posted by Lic