
VBAで配列からbmp画像を出力する方法を教えてください。
例えば、
dim a(255,255)
で作成した二次元配列があり、それぞれの中に0~255の数値が格納されているとします。
この画像からグレースケールあるいは任意の配色で
256x256の解像度のbmp画像を出力するプログラムを
VBAで作りたいのですがどのようにすれば良いですか?
検索して調べたのですが、
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr; …
http://akadamashy.blog68.fc2.com/blog-entry-915. …
のサイトにビットマップ画像を出力するための
プログラムが記載されていました。
しかしながら、どうしても配列からどうやって出力すれば良いか分かりません。
どなたか教えてください。
No.2ベストアンサー
- 回答日時:
> Sub sample()のところでp(500,500)の各配列に1か0を代入していますが、
> 0~255までのカラーを使いたい場合には、
> With RGBQUAD(0)で0~255まで全て定義する必要があるのでしょうか?
先の回答で示したページをよく読んでください。
> 変数kを0から7まで繰り返して、* 2 ^ (7 - k)を足していく操作が理解できないのですが
> 何をやっているのでしょうか?
実際にそのコードを実行し、数値を変更したりしてどのような画像が出来上がるのか試してみてください。理解しなくても関係の無いところだと思われますが。
> また、式の中で「\」マークが出てきますがこれは何を意味しているのでしょうか?
実際にご自身で計算式を作って試してみればわかることです。
以下の2行を実行してみてください。
Debug.Print 10 \ 3
Debug.Print 10 / 3
演算子
http://www.officepro.jp/excelvba/basic/index6.html
何もせず示したページもろくに読まないで質問ばかりするのはやめましょう。時間の無駄です。
ありがとうございます。
自分でいろいろと試してもう一歩のところなのですが、
.biBitCount = 8
を指定した後に
For ddd = 0 To 255
With RGBQUAD(ddd)
.rgbRed = ddd
.rgbGreen = ddd
.rgbBlue = ddd
End With
Next
でRGBQUADに255通りの配色を設定する必要があることは分かりました。
これらの色を使いたいのですが、
p()に0や1以外の50などの値を代入すると
* 2 ^ (7 - k)を足していく操作の過程でオーバーフローしてしまいます。
モノクロビットマップと256色ビットマップで
p配列をbuf配列に移す方法が異なるように思うのですが
どのようにすれば良いでしょうか?
恐らく、ここさえクリアできれば完成できると思います。
よろしくお願いいたします。
No.1
- 回答日時:
質問者さんが調べたと示された最初のサイトに、配列から出力するコードが最後に回答として出されてますが、それを参考にしてみてはいかがですか。
以下のサイトも参考にしてください。
BMP ファイルフォーマット
http://www.kk.iij4u.or.jp/~kondo/bmp/
上記のサイトの中で
With RGBQUAD(0)
.rgbRed = 200
.rgbGreen = 255
.rgbBlue = 255
End With
With RGBQUAD(1)
.rgbRed = 200
.rgbGreen = 200
.rgbBlue = 100
End With
というところですが、
Sub sample()のところでp(500,500)の各配列に1か0を代入していますが、
0~255までのカラーを使いたい場合には、
With RGBQUAD(0)で0~255まで全て定義する必要があるのでしょうか?
それと
For j = 1 To Ny
For i = 1 To (Nx \ 8) * 8 Step 8
l = i \ 8 + 1
For k = 0 To 7
buf(l, j) = buf(l, j) + p(i + k, j) * 2 ^ (7 - k)
Next
Next
If (Nx \ 8) * 8 < Nx Then
l = i \ 8 + 1
For k = 0 To Nx - (Nx \ 8) * 8 - 1
buf(l, j) = buf(l, j) + p(i + k, j) * 2 ^ (7 - k)
Next
End If
Next
ここでやっているのは、pに入っているデータをbuf配列に移しているということは分かるのですが、
xとyをforループで繰り返すのは理解できるのですが、
変数kを0から7まで繰り返して、* 2 ^ (7 - k)を足していく操作が理解できないのですが
何をやっているのでしょうか?
また、式の中で「\」マークが出てきますがこれは何を意味しているのでしょうか?
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
先頭アドレスとは何ですか?
-
なぜ配列は0から始まるのです...
-
VBで構造体の配列を関数に渡す...
-
配列を使わずに、変数名を動的...
-
構造体の配列を関数に渡すには
-
銀行ATMの数字キーの配列
-
4勤2休のシフト作成
-
LGノートPCグラムについて
-
配列の重複削除について
-
C++ vectorに配列をプッシュしたい
-
【Mathematica】 Protectされて...
-
C言語初心者 構造体 課題について
-
C言語でのカンマ区切りについて
-
複数のボタンを配列で扱う方法...
-
【速いブラインドタッチ】手を...
-
VB.NET 構造体の配列の検索機能...
-
太鼓の達人の段位道場3級にて、
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C# Listを使わずに2次元配列の...
-
配列を使わずに、変数名を動的...
-
複数の選択範囲の行番号を個別...
-
配列で格納したものをmsgboxで...
-
【速いブラインドタッチ】手を...
-
C言語で特定列だけを抽出して配...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
メモリの初期値
-
C++ vectorに配列をプッシュしたい
-
Redimした動的配列はEraseする...
-
VBで構造体の配列を関数に渡す...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
Functionの戻り値を2次元配列...
-
ガウスの消去法のプログラム
おすすめ情報