作成:2018/6/10
改訂:2018/11/18(64bit 版の Excel に対応)

Excel で画像ファイルをセル上に数値展開しよう

Menu > Image viewer

1、概要

Excel で jpeg などの画像ファイルを開いて、セル上に数値展開するマクロを作成したので、その使い方について解説したページです。
画像ファイルをデコードするエンジンには、Microsoft から提供されている Windows Imaging Component (WIC) を使い、C++ 側で作成したDLL を介して Excel へデータを渡してます。
WIC を使用しているので、JPEG,BMP,TIFF,PNG,GIF 形式の画像フォーマットに対応し、RGB の各要素へ数値展開することが出来ます。

1-1、開発環境

・ OS : Windows7 Professional SP1, 64bit版
・ Office : Office 2010, 32bit版、又は 64bit版
・ Visual Studio : Visual Studio Community 2017(DLL の作成に使用)

1-2、動作確認環境

・ OS : Windows7 Professional SP1,64bit版、又は Windows10 Home,32bit版
・ Office : Office 2010, 32bit 版又は 64bit版、又は Office 2013、32bit版

2、プログラムの入手

・以下に日本語版と英語版の2種類ありますので、どちらかダウンロードください。

◆ 日本語版はここから。(file size:49kByte)

◆ 英語版はここから。(file size:44kByte)

・ダウンロードしたファイルを解凍すると、下記3つのファイルがあります。

1、image_viewer.xlsm → 画像ファイルを展開するマクロ
2、image-vbif32.dll → 32bit 版の Excel から Windows Imaging Component(WIC) Library を使えるようにする DLL
3、image-vbif64.dll → 64bit 版の Excel から Windows Imaging Component(WIC) Library を使えるようにする DLL

コメント:
このプログラムは、画像ファイルを開いてピクセルデータを Excel のシートへ書き込むシンプル版のマクロです、更に画像ファイルへの保存機能などを付けた高機能版もこちらにあります。シンプル版の特長は、xlsx形式での書式上限は 64,000 通りを超えると、「セルの書式が多すぎるため、書式を追加できません」のエラーが出ますが、セルへの色づけは 1677万色のフルカラーで実行します。

3、Excel で使う準備

3-1、ランタイムライブラリの入手

・コントロールパネルから 'プログラムと機能' を立ち上げ、
32bit 版の Excel を使われている方は 'Microsoft Visual C++2017 Redistributable (x86) - *' がインストールされているかどうか確認、
64bit 版の Excel を使われている方は 'Microsoft Visual C++2017 Redistributable (x64) - *' がインストールされているかどうか確認してください。


・インストールされてない場合は、下記 URL から、Visual Studio 2017 の Microsoft Visual C++ 再頒布可能パッケージを入手してインストールしてください。
https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads

3-2、DLL の環境設定

・Excel 側から DLL を呼び出せるようにパソコンの環境を整える。

・Windows OS が 32bit 版の場合:
image-vbif32.dll のファイルを、'C:\Windows\System32' へ入れる。

・Windows OS が 64bit 版の場合:
Excel が 64bit 版の場合は、image-vbif64.dll のファイルを 'C:\Windows\System32' へ入れる。
Excel が 32bit 版の場合は、image-vbif32.dll のファイルを 'C:\Windows\SysWOW64' へ入れる。

【上記と違うやり方】

注) 上記の方法で DLL を登録した方は、ここの項目を飛ばして次へ行ってください。
Windows のシステムフォルダへ入れるのが嫌な人は、環境変数の path に DLL を入れたフォルダパスを追加する方法もあります。
マイコンピュータのプロパティ → システムの詳細設定 → 詳細設定 → 環境変数(N) から path の環境設定を編集してください。

・Windows7 の場合の画面
例えば c:\work に入れた場合は、変数値(V) の最後に ';c:\work' を足してOKする。


・Windows10 の場合の画面
・システムの環境変数(S) の 変数 Path の項目をクリックして、編集ボタンを押す。


・例えば c:\work に入れた場合は、空の項目をダブルクリックし 'c:\work' を入力して Enter、OK ボタンを押す。



・Excel 側からこの DLL をコールしたとき、 'ファイルが見つかりません' のエラーが出る場合は環境設定が正しく出来てないので、ここの内容を良く見直してください。 Microsoft Visual C++ 再頒布可能パッケージをインストールしていない場合も同じエラーが出ます。


4、使い方の説明

4-1、プログラムの起動方法

・ image_viewer.xlsm を立ち上げると、TOOL タブが表示されますので、その中の Image グルーブのボタンをクリックするとプログラムが立ち上がります。
このリボンは image_viewer.xlsm のシートを作業対象としている時には出て、他のワークブックへ行くと表示されなくなります。
他のワークブックでもこのリボンを表示したい場合は、ファイルを image_viewer.xlam のアドイン形式に保存しなおして、アドイン登録して使ってください。

・ 各ボタンの機能説明
[Read file] : 画像ファイルを読み込んで、シートへ要素展開する。
[Paint area] : 囲った範囲に色を付ける。→ Excel の制約で、大きな画像に色を付けようとすると、「セルの書式が多すぎるため、書式を追加できません」 のランタイムエラーが出るので、後から囲った範囲に色を付けられるようにしてます。
[Erase paint] : セルに付けた書式(色)を削除する。


4-2、Read file

・ Read file ボタンを押すと、Open file dialog が立ち上がるので、Excel へ展開したい画像ファイルを選んで開く(O)ボタンを押してください。
対応している画像フォーマットは、JPEG,BMP,TIFF,PNG,GIF 形式で、RGB の各要素 8bit×3 = 24bit の画像データを扱うことを想定してます。
あまり大きなサイズの画像を展開しようとすると Excel が固まってしまいますので、適切に画素を間引きしてから開いてください。

・ 次に "取り込む色の選択" ダイアログが表示されたら、Excel へ展開したいデータを選んで OK ボタンを押してください。
1、RGB = 3原色取り込みます。 Excel のシートへは '255,255,255' の様に R,G,B の順にカンマ区切りの文字列で書き込まれます。
2、Red,Green,Blue = 赤色又は緑色又は青色のみ取り込みます。Excel のシートへは '255' の様な数値(文字列)で書き込まれます。
3、Y Signal = 輝度信号に変換して取り込みます。Excel のシートへは '255' の様な数値(文字列)で書き込まれます。
計算式 : Y = 0.298912×R + 0.586611×G + 0.114478×B の NTSC 方式で計算。

・ 次に "セルに色(濃淡)つけますか?" のメッセージボックスが表示されたら、'はい' か 'いいえ' を選択してください。

※ Excel の制約で、xlsx形式での書式上限は 64,000 通りですので、RGB で色づけした場合は 320×200Pxcel より小さな画像であれば確実に全部色が付きます。320×200Pxcel を超える画像に RGB で色づけしたい場合は、"セルに色(濃淡)つけますか?" のメッセージボックスには、'いいえ' を選択し、後述する [Paint area] の機能を使って部分的な色を付けを推奨します。

・ 下図は RGB 取り込みで、"セルに色(濃淡)つけますか?" のメッセージに 'はい' を選択し、320×240pixcel の画像を読み込んだときの画面。
シートの1列目(A列)は、画像の高さ方向のピクセル番号が書き込まれます、シートの1行目は、画像の幅方向のピクセル番号が書き込まれます。
画像は B2 セルから展開されてますので、座標位置の参考にしてください。
また画像上のセルをクリックすると、そのセルの RGB 値が解ります。

・ 下図は Red 取り込みで、"セルに色(濃淡)つけますか?" のメッセージに 'はい' を選択し、320×240pixcel の画像を読み込んだときの画面。

・ 下図は Y Signal 取り込みで、"セルに色(濃淡)つけますか?" のメッセージに 'はい' を選択し、320×240pixcel の画像を読み込んだときの画面。


参考

・ 数式のエラーチェックで表示が遅くなるので、Excel の ファイル-オプション-数式から 、'文字列形式の数値、またはアポストロフィで始まる数値(H)' のエラーチェックルールを外した方が少し動作が軽快になります。



4-3、Paint area

・ 先ほどと同じ画像を 1024×768 pixcel に加工して、 RGB 取り込み、"セルに色(濃淡)つけますか?" のメッセージに 'はい' で画像を取り込んだ場合、 セルの書式が多すぎるため、書式を追加できませんのランタイムエラーでマクロが止まってしまいます。
この場合、"セルに色(濃淡)つけますか?" のメッセージには 'いいえ' で画像を取り込み、あとで Paint area の機能を使って、関心部分のみセルに色を付けてください。

・ 使い方は、色を付けたい部分をマウスでドラッグして囲ったあと、 Paint area ボタンを押してください。
'何色つけますか' のダイアログが出てきますので、付けたい色を選んで OK ボタンを押してください。
→ セルに単色データしか入ってないのに RGB(3色塗り)を選んだ場合は何も色づけしません、またセルに3色データ入っていて、単色塗りを指示した場合も同様です。元々 Red で取り込んでたセルを Green や Y Signal に塗り替えることは可能です。


4-4、Erase paint

・セルの書式を削除します。
「セルの書式が多すぎるため、書式を追加できません」のランタイムエラーが出た場合は、Erase paint ボタンを押して一旦セルの書式を削除してからワークシートを保存、その後 Excel を再起動してから作業を続けてください。

5、DLL の使い方

・簡単に DLL の使い方を説明します。

関数宣言部分


Declare Function vb_image_attrtbute Lib "image-vbif.dll" (FilePath As Any, width As Long, height As Long, _
				pDpiX As Double, pDpiY As Double) As Long
				
Declare Function vb_image_CopyPixels Lib "image-vbif.dll" (FilePath As Any, ImgBuf As Any, BufSize As Long) As Long

・ vb_image_attrtbute → 画像の属性を返す関数
FilePath を渡すと、width(画像の幅),height(画像の高さ),pDpiX(幅の解像度),pDpiY(高さの解像度) が帰ってきます。
関数の戻り値は0が正常終了、それ以外はエラーです。

・ vb_image_CopyPixels → 画像のピクセルデータを返す関数
FilePath, BufSize を渡すと、VB 側でメモリ確保した ImgBuf に画像のピクセルデータが帰ってきます。
ImgBuf は Byte array 型の1次元配列で、Pbgra32 ピクセル形式 = 青、緑、赤、アルファ 順で各 8bit のデータが帰ってきます。
関数の戻り値は0が正常終了、それ以外はエラーです。


関数コール部分

・vb_image_attrtbute コール部分
vb_image_attrtbute へ渡す FilePath は、文字列の最後に0を付加し、Unicode の Byte array に直してから渡してください。


FilePath ="c:\work\img_01234.jpg" & Chr(0)
FilePath2 = StrConv(FilePath , vbFromUnicode)
ret = vb_image_attrtbute(FilePath2(0), width, height, pDpiX, pDpiY)

・vb_image_CopyPixels コール部分
ImgBuf の BufSize は、RGBA で1画素 4byte 使うので、その分の容量を確保してください。


    ' バッファサイズの計算&確保
    BufSize = width * height *4
    ReDim ImgBuf(BufSize)

    ' 画像の要素取得
    ret = vb_image_CopyPixels(FilePath2(0), ImgBuf(0), BufSize)

6、プロジェクトファイル

今回作成した DLL のプロジェクトファイル一式はここにあります。(file size:8kByte)
Visual Studio 2017 を使って、X86,Release で Build すると 32bit 版の image-vbif.dll が出来ます。


7、最後に

単純に画素の数値を見てみたい、という時がたまにあって、世の中便利と思えるツールがなかなか無いので今回作ってみました。Photoshop とかの画像編集ソフトでも見れますが、1画素ずつ調べるのも面倒だし...。
Excel の制約で 「セルの書式が多すぎるため、書式を追加できません」 のランタイムエラーが出るのは、ちょっと頂けませんが、Microsoft さんが改善してくれること期待しましょう。


8、参考 URL

1、WIC API Overview : https://msdn.microsoft.com/ja-jp/library/windows/desktop/ee719655(v=vs.85).aspx
2、Windows Imaging Component Reference : https://msdn.microsoft.com/en-us/library/windows/desktop/ee719902(v=vs.85).aspx