これ何だ?プログラム編

MEMO

2011年11月08日 22:07

またまた備忘録となります。
いよいよ最終回です。ご興味があれば、どうぞ。

シリーズになってます。
ここから先は、以前の記事もご覧にならないと
何やってんの?
が伝わらないと思います。

これ何だ?正解は・・・
  エクセルのセルに色を付けて、
  画像を表現することに挑戦してます。
これ何だ?の種明し
  一つ一つ手作業でセルに色は付けられないので、
  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列へ書出し
繰り返し


関連記事
iPad Air 分解 自作
iPhone 5 自作
さるぼぼクエスト
Mountain Lion いろいろ勘違いしてた
ちょっ!ちょっ!ちょけらまいか
あらびん どびん はげちゃびん
見れなかった人は、
Share to Facebook To tweet