午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

Bitmapビジュアライザ、BitmapData、LockBits、配列に入れた時の順番

bitmap visualizer
BitmapData = Bitmap.LockBitsとか
画像処理をするときに使うBitmapDataのテスト
よくわかっていない
画像データをbyte配列に入れて、それを直接操作する感じ?
配列に入れた時にどの順番に入れられているのかの確認
2x2のBitmap画像を入れた時にどの順番になるのか見てみたのが下の画像
イメージ 1
2x2のBitmap画像はARGB各8bitの合計32bit、PixelFormatでいうとFormat32bppArgb
ARGBはBGRAの順番になる、なんで逆になるんだろう、紛らわしい
 
 
Imports System.Drawing.Imaging

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ’2x2の画像作成
    Dim bmp As New Bitmap(2, 2, Imaging.PixelFormat.Format32bppArgb)
        Dim x, y, r As Integer
        For y = 0 To bmp.Height - 1
            For x = 0 To bmp.Width - 1
                bmp.SetPixel(x, y, Color.FromArgb(255, r, 0, 0)) 'pixelに色指定
                r += 64 '赤要素に64づつ足していく
            Next
        Next

    ’画像をbyte配列に入れる
        Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
        Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat)
        Dim ptr As IntPtr = bmpData.Scan0 '画像があるメモリのアドレス?
        Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height 'Strideが1ラインぶん(横pixel*4=8)
        Dim rgvValues(bytes - 1) As Byte 'byte配列変数、入れ物

        System.Runtime.InteropServices.Marshal.Copy(ptr, rgvValues, 0, bytes) '入れ物にデータが入る

        bmp.UnlockBits(bmpData)

    End Sub
End Class
 
 

f:id:gogowaten:20191017133301p:plain

22行目で一時停止してrgvValuesの中を確認
 
プログラム実行途中、変数に入っている画像を確認したい、そんなとき
tinq(もしくはTinqWill)さんが作って公開してくれている
 
をインストール
 

f:id:gogowaten:20191017133315p:plain

確認したいタイミングで一時停止した状態で
画像が入っている変数にマウスカーソルを置くと出てくる虫眼鏡をクリックすると
 
イメージ 4
確認できる
今回の画像は2x2だからわかりづらいw
クリップボードにコピーもできるから
Pixtack紫陽花に貼り付けて30倍に拡大したのが
 
イメージ 5
これとか
イメージ 6
これ
 
Pixtack紫陽花の文字の描画では順番に
背景色→枠→縁取り→影→文字→回転とかしている
最終的にできた画像が期待通りではない時に、どこで間違っているのか確認したい
普通なら一回の処理ごとに画像をファイルとして保存する必要があるけど
Bitmapビジュアライザがあると一時停止した時にすぐに確認できるので大変便利
tinq(もしくはTinqWill)さん、ありがとう!
 
 
関連記事は5年後

gogowaten.hatenablog.com

表示するだけのものだけどできた!