2011年11月08日
これ何だ?プログラム編
またまた備忘録となります。
いよいよ最終回です。ご興味があれば、どうぞ。
シリーズになってます。
ここから先は、以前の記事もご覧にならないと
何やってんの?
が伝わらないと思います。
「これ何だ?正解は・・・」
エクセルのセルに色を付けて、
画像を表現することに挑戦してます。
「これ何だ?の種明し」
一つ一つ手作業でセルに色は付けられないので、
VBA(プログラム)で処理します。
「ビットマップ画像の仕組み」
画像の点1px分のデータを取り出すために、
ピットマップファイルの仕組みをしらべました。
「ビットマップ画像の仕組み2」
ビットマップファイルと4の倍数について調べました。
の続きです。
画像を読込み、1ピクセルをセル一つに割り当てて、
エクセルのセルで画像を再現する事をVBA(プログラム)でやってます。
今回、
最終回は、プログラムの中身についてMEMOしておきます。
これです。

データの中身が確認できるように、データーチェック部分で、
内容をエクセルのB列に書き出しています。

ここで、問題になっていた
画像サイズに制限がある理由についてですが、
今さらですけど、
サイズの大きい画像でエラーが起こるのは、
このデータチェック部分のせいのような気がしてきました。
データーチェック部分のループ i が、
整数のため、32767までしかカウントできないためではないか?
と記事を書きながら、思いました。
続きは、次回にしようと思いましたが、シリーズが長くなっているので、
このまま続けます。
急遽、実験してみます。
データチェック部分を無効にして実行してみます。
横幅240px 高さ180px
240 × 180 × 3 + 54 + 2 = 129656バイトのファイルです。

なんと!できました。
バグったかと思うほど、3分くらい?処理に時間がかかりました。
通常の100%表示にするとこんな感じです。

セル一つ一つに色が付いているのが確認できます。
詳しい原因は、あくまで推測ですが、
データーのチェックと確認の為、作成した部分で、
不具合を起こしていました。
ちょっとショックでしたが、ギリギリで気付いてよかったです。
< 追記 >
エクセルの行列の上限や、ループ変数 L Cの上限をクリア
しているわけではありません。
エラー処理は行っていないので、エクセルの列数、処理時間も考えて
240px × 180pxくらいが、限界と思っています。
いつもの事ですが、
内容に誤りがあっても責任は負えません。
長かったシリーズも、これで完結です。
何かの役に立つとは思いませんが、やってみたかった事なので、
書き留めて置くことにしました。
おまけ
いよいよ最終回です。ご興味があれば、どうぞ。
シリーズになってます。
ここから先は、以前の記事もご覧にならないと
何やってんの?
が伝わらないと思います。
「これ何だ?正解は・・・」
エクセルのセルに色を付けて、
画像を表現することに挑戦してます。
「これ何だ?の種明し」
一つ一つ手作業でセルに色は付けられないので、
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列へ書出し
繰り返し
備忘録ですので、細かい事は気にしないでください。
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列へ書出し
繰り返し
スポンサーリンク
Posted by MEMO at 22:07│Comments(0)
│EXCEL劇場