【VBA応用】Excel VBAとビットマップ(BMP)ファイルで学ぶ画像処理

VBAで「画像を扱いたい」と思う場面は少なくありませんが、標準機能ではリサイズや加工といった操作は限られています。そこで有効なのが「ビットマップ(BMP)ファイルを直接操作する方法」です。BMPは構造がシンプルで、ヘッダ情報やピクセルデータがそのまま格納されているため、VBAでも比較的扱いやすく、画像処理の仕組みを理解しながらコードを書けるのが大きな特徴です。

OpenCVのようなライブラリなら高度な処理を簡単に実現できますが、内部の仕組みを理解するのは難しい面があります。その点、VBAでBMPを操作すれば「画像はどのようにデータとして表現されているか」を直接確認でき、画像処理の基礎的な処理内容の理解に役立ちます。

こうして得られた知識は、他のプログラミング言語で画像処理を行う際にもOpenCV等のライブラリを利用する際にも必ず役立ちます。また、マクロの一部として画像処理を組み込めば、マクロで実現できることの幅が大きく広がります。ぜひVBAを通して画像処理の理解を深めてみてください。

 icon-warning 注意事項 

Excel VBAと謳っていますがVBAであればどのアプリケーションでも同様の方法で利用可能です。

BMP画像のファイル構造

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

 
icon-edit ヘッダー部

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

'Bitmapファイルヘッダ構造体
Private Type BITMAPFILEHEADER
    bfType As String * 2        'ファイルタイプ ("BM")
    bfSize As Long              'ファイル全体のサイズ(ヘッダー部サイズ+データ部サイズ)
    bfReserved1 As Integer      '予約領域(※常に0)
    bfReserved2 As Integer      '予約領域(※常に0)
    bfOffBits As Long           'データ部の開始位置(ヘッダ部サイズ=54)
End Type

'Bitmap情報ヘッダ構造体
Private Type BITMAPINFOHEADER
    biSize As Long              'この構造体のサイズ
    biWidth As Long             '画像の幅
    biHeight As Long            '画像の高さ
    biPlanes As Integer         '平面数 (※常に1)
    biBitCount As Integer       'ピクセルあたりのビット数(色深度)
    biCompression As Long       '圧縮形式
    biSizeImage As Long         '圧縮画像データサイズ
    biXPelsPerMeter As Long     '水平方向の解像度
    biYPelsPerMeter As Long     '垂直方向の解像度
    biClrUsed As Long           '使用される色数
    biClrImportant As Long      '重要な色数 (基本は0)
End Type

 
icon-edit データ部

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

'色情報
Private Type RGBTRIPLE
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
End Type

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

上記内容でイメージがつかみづらい場合は下記ページのサンプルコードを実行するとイメージが付きやすくなります。上記の構造をすべてVBAで動的に作成して画像として出力する処理を行っています。

 

画像処理一覧

前項の通り、ビットマップはデータ部に各ピクセルのRGB情報が順に並んでいるだけという非常にシンプルなものとなっています。そのためこのデータ部の色情報を操作するだけで

画像を読み込む / 画像を書き出す
画像をグレースケール化する
・画像を二値化する(白黒)
・画像をネガポジ反転する
・画像を上下・左右反転する
・画像を回転する
・指定位置に長方形を描画する
・テンプレートマッチングを行う
・画像を平滑化する(ガウシアン)
 σ/カーネルサイズ指定。
・マスクを適用して領域抽出する 
 マスク内のみを残す/外側を透過・黒塗り・別値で埋める。
・画像を2次元フーリエ変換する
 振幅・位相の表示、逆変換、周波数マスク適用。

 

2026年1月27日Excel,VBA,画像処理