dポイントプレゼントキャンペーン実施中!

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. …

のサイトにビットマップ画像を出力するための
プログラムが記載されていました。

しかしながら、どうしても配列からどうやって出力すれば良いか分かりません。

どなたか教えてください。

A 回答 (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

何もせず示したページもろくに読まないで質問ばかりするのはやめましょう。時間の無駄です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

自分でいろいろと試してもう一歩のところなのですが、

.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配列に移す方法が異なるように思うのですが
どのようにすれば良いでしょうか?

恐らく、ここさえクリアできれば完成できると思います。

よろしくお願いいたします。

お礼日時:2014/02/11 13:40

質問者さんが調べたと示された最初のサイトに、配列から出力するコードが最後に回答として出されてますが、それを参考にしてみてはいかがですか。



以下のサイトも参考にしてください。

BMP ファイルフォーマット
http://www.kk.iij4u.or.jp/~kondo/bmp/

この回答への補足

自己解決しました。
ありがとうございました。
 

補足日時:2014/02/11 15:29
    • good
    • 0
この回答へのお礼

上記のサイトの中で


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)を足していく操作が理解できないのですが
何をやっているのでしょうか?

また、式の中で「\」マークが出てきますがこれは何を意味しているのでしょうか?

よろしくお願い致します。

お礼日時:2014/02/11 11:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!