これ何だ?プログラム編
またまた備忘録となります。
いよいよ最終回です。ご興味があれば、どうぞ。
シリーズになってます。
ここから先は、以前の記事もご覧にならないと
何やってんの?
が伝わらないと思います。
「
これ何だ?正解は・・・」
エクセルのセルに色を付けて、
画像を表現することに挑戦してます。
「
これ何だ?の種明し」
一つ一つ手作業でセルに色は付けられないので、
VBA(プログラム)で処理します。
「
ビットマップ画像の仕組み」
画像の点1px分のデータを取り出すために、
ピットマップファイルの仕組みをしらべました。
「
ビットマップ画像の仕組み2」
ビットマップファイルと4の倍数について調べました。
の続きです。
画像を読込み、1ピクセルをセル一つに割り当てて、
エクセルのセルで画像を再現する事をVBA(プログラム)でやってます。
今回、
最終回は、プログラムの中身についてMEMOしておきます。
これです。
データの中身が確認できるように、データーチェック部分で、
内容をエクセルのB列に書き出しています。
ここで、問題になっていた
画像サイズに制限がある理由についてですが、
今さらですけど、
サイズの大きい画像でエラーが起こるのは、
このデータチェック部分のせいのような気がしてきました。
データーチェック部分のループ i が、
整数のため、32767までしかカウントできないためではないか?
と記事を書きながら、思いました。
続きは、次回にしようと思いましたが、シリーズが長くなっているので、
このまま続けます。
急遽、実験してみます。
データチェック部分を無効にして実行してみます。
横幅240px 高さ180px
240 × 180 × 3 + 54 + 2 = 129656バイトのファイルです。
なんと!できました。
バグったかと思うほど、3分くらい?処理に時間がかかりました。
通常の100%表示にするとこんな感じです。
セル一つ一つに色が付いているのが確認できます。
詳しい原因は、あくまで推測ですが、
データーのチェックと確認の為、作成した部分で、
不具合を起こしていました。
ちょっとショックでしたが、ギリギリで気付いてよかったです。
< 追記 >
エクセルの行列の上限や、ループ変数 L Cの上限をクリア
しているわけではありません。
エラー処理は行っていないので、エクセルの列数、処理時間も考えて
240px × 180pxくらいが、限界と思っています。
いつもの事ですが、
内容に誤りがあっても責任は負えません。
長かったシリーズも、これで完結です。
何かの役に立つとは思いませんが、やってみたかった事なので、
書き留めて置くことにしました。
おまけ
プログラムを直訳してみます(笑)
備忘録ですので、細かい事は気にしないでください。
inpurFileName 読込先ファイル名(パス)変数
inpurfn ファイル番号変数
buffer バイナリファイルテーブル 1バイトづつ格納する変数
'**********************
'ファイル読込
'**********************
inputFileNameに元画像のファイルパスを入れる
inputFnにFreeFileで空いているファイル番号を入れる
バイナリファイルinputFileNameを開いて
ファイル番号#inputFnへ読み込み
bufferテーブル ReDimは配列宣言
LOFはファイルの長さ、で配列を初期化
ファイル番号#inputFnをバイナリで読み込んで
buffer配列にByte型で格納
ファイル閉じる
'**********************
'ファイル書込
'**********************
iにBMPファイルのデータ領域までのオフセット値54を入れる
23バイト目の画像高さで、L 回(行数)ループ 下から上へ
19バイト目の画像の横幅で、C 回(列数)ループ 左から右へ
条件 bufferのインデックス最大値(バイト数)
より小さければ次の処理をする
pxのrgbカーラーを bgrの順に3バイトづつ読み取り
(bufferインデックスは「0」始まり)
bにbuffer(i) を入れる 例(54+1番目の内容)
Gにbuffer(i+1)を入れる 例(54+1+1番目の内容)
bにbuffer(i+2)を入れる 例(54+1+2番目の内容)
セルの上からL行目 左からC列目を rgbで塗りつぶし
iに3をプラス 次のpx分まで、3バイト分インデックス移動
bufferのインデックス最大値
以上になったら何もしない
条件終わり
横幅 繰り返し
高さ 繰り返し
'**********************
'データチェック
'**********************
デバッグウィンドウ 配列インデックスの最小値と最大値の表示
バイナリデータを1バイトづつシートに展開してみる
配列のインデックス数(
画像データバイト数)でループ読み取り
(エラーになると思われる場所)
インデックスは「0」始まり gyoはi+1行目
buffer(i)をセルi+1行目 B列へ書出し
繰り返し