BMPファイルを保存しようとしているのですが、ちゃんと保存できません。
以下のコードでそれなりに保存はできるのですが、ペイントで開くとゴミが出ます。完璧に保存できるようにしたいのですがどのようにしたら良いでしょうか?
長々とすみませんがよろしくお願いします。
'---必要なパディング数を求める---
PBox = SetWidth \ 8 'SetWidthはテキストボックスから取得したBMPの幅
If SetWidth Mod 32 <> 0 Then
AllBox = ((SetWidth + 31) \ 32) * 4
PBox = AllBox - PBox 'パディング数
End If
Open FilePath For Binary Access Write As 1
ここでヘッダーの書込み
'ビットマップデータの順序を逆にする
k = SetHeight - 1'SetHeightはテキストボックスから取得した高さ
'---ビットが格納されている配列の順番を逆にする--- For y = 0 To SetHeight - 1
For x = 0 To SetWidth - 1
writebox(x, k) = matrix(x, y) 'クロは1、シロは0が入っている
Next x
k = k - 1
Next y
'2進数を計算しファイルに書込む
For y = 0 To SetHeight - 1
For x = 0 To SetWidth - 1
add = add + writebox(x, y) * Mask(shift)
'Maskには(&H80,&H40,&H20,&H10,&H8,&H4,&H2,&H1が入っている)
shift = shift + 1
If shift = 8 Then
add = Not add '0がクロ表示のためビットを反転する
Put 1, , add
shift = 0
add = 0
End If
Next x
shift = 0
If SetWidth Mod 32 <> 0 Then
For k = 0 To PBox - 1
Put 1, , CByte(255) 'パディング領域の書込み
Next k
End If
Next y
Close
For x = 0 To SetWidth - 1
・
・
・
Next x
のループを抜けたときに、Shiftが0でないと
最後のデータが書き込まれないのでは?
試してないけど、これでどうでしょうか?
For x = 0 To SetWidth - 1
・
・
・
Next x
If shift <> 0 Then
For x = shift To 7
add = add + Mask(x)
Next x
add = Not add
Put 1, , add
shift = 0
add = 0
End If
If SetWidth Mod 32 <> 0 Then
For k = 0 To PBox - 1
Put 1, , CByte(255) 'パディング領域の書込み
Next k
End If
確かに最後のデータが書込まれないですね・・・
アドバイスありがとうございます。パディングの計算もなんだか間違えているようなので、最初から考え直してみました。
以下のコードにしたらうまくいきました。すみません質問しときながら自分で解決しちゃいました。
WBox = (SetWidth - 1) \ 8 + 1 'バイト数計算
Temp = ((WBox - 1) \ 4 + 1) * 4 - 1 '4バイトの境界にそろえる
ReDim writebox(Temp, SetHeight * 123 - 1)
ここでヘッダー情報の書き込み
For y = SetHeight * 123 - 1 To 0 Step -1 '1ラインずつ下から読込み
For x = 0 To WBox - 1 '1バイトずつ作成
tcol = 0
For z = 0 To 7 '8ビット
Temp = matrix(x * 8 + z, y)
If Temp = 1 Then tcol = tcol + 2 ^ (7 - z) '黒の場合
Next
writebox(x, SetHeight * 123 - 1 - y) = tcol
Next
Next
Open sWriteFilePath For Binary Access Write As 1
Put 1, , BI.bmiFHeader 'ヘッダーをファイルに書込む
Put 1, , BI.bmiIHeader
Put 1, , BI.bmiRGBHeader
Put 1, , writebox() 'ドットのデータをファイルに書込む
Close
ツイート | ![]() |