概要
Bitmap をシステム メモリにロックします。
名前空間:System.Drawing
アセンブリ:System.Drawing (system.drawing.dll 内)
宣言
Bitmap.LockBits(ByVal rect As System.Drawing.Rectangle, ByVal flags As System.Drawing.Imaging.ImageLockMode, _
ByVal format As System.Drawing.Imaging.PixelFormat)
rect…rectangle構造体を指定します。
ImageLockMode…ReadOnlyやReadWriteなどを指定します。
PixelFormat…Bitmapのピクセルフォーマットを指定したり、Format32bppArgbなどを指定します。
(通常はBitmapDataを取得したいBitmapのPixelFormatプロパティを指定します)
とりあえず程度ながら、
使い方例
Dim bmpSr As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat)
Dim ptrSr As IntPtr = bmpSr.Scan0
Dim bytesSr As Integer = bmpSr.Stride * bmp.Height
Dim rgbvaluesSr(bytesSr) As Byte
System.Runtime.InteropServices.Marshal.Copy(ptrSr, rgbvaluesSr, 0, bytesSr)
’
’ rgbvaluesSrの編集
’
System.Runtime.InteropServices.Marshal.Copy(rgbvaluesSr, 0, ptrSr, bytesSr)
bmp.UnlockBits(bmpSr)
こんな感じで、BitmapからBitmapDataを取得し、
そこから、バイト配列へコピーし、各値を編集していきます。
32bppのBitmapから8bppのBitmapへ変換したりすることもできます。
関連記事
・Bitmapクラス
・BitmapDataクラス
・画像を読み込み編集する1(LockBits)
・画像を読み込み編集する2 (LockBits)
・16色Bitmapを作成し描画する(LockBits使用)
・Byte配列について
追記
もう少し正確にLockBitsについて述べると、
bmp.LockBits(…)にてbmpをメモリにロックし、 それをBitmapDataに入れる。
bmpSr.Scan0で、bmpの最初のデータのアドレスをptrSr(IntPtr型)に入れる。
Dim rgbvakues(…)にて、画像分のByte配列を生成し、
System.Runtime.InteropServices.Marshal.Copy(…)にて、
データの先頭アドレスptrSrからrgbvaluesSrへコピーする。
処理終了後、System.Runtime.InteropServices.Marshal.Copy(…)にて、
rgbvaluesSrの内容を、ptrSrを先頭アドレスとするメモリに戻す。
bmp.UnlockBits(…)にて、bmpのロックを解除する。
(ロックを解除しないとDrawImageメソッドなどで描画できなくなります)
参考情報
※ページのURLは変更になりますので、その際は検索結果を開いて下さい。
システム開発のためのVB.NETプログラミング関係一覧に戻る