BMPデータの保存方法について

解決


初心者  2006-06-30 00:00:53  No: 132095

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


LESIA  2006-06-30 00:52:52  No: 132096

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


初心者  2006-06-30 02:06:27  No: 132097

確かに最後のデータが書込まれないですね・・・
アドバイスありがとうございます。パディングの計算もなんだか間違えているようなので、最初から考え直してみました。
以下のコードにしたらうまくいきました。すみません質問しときながら自分で解決しちゃいました。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加