画像を読み込み編集する3 (LockBits)


事前準備


こちらのボタンを4つ貼り付けたバージョンです。

各ボタンを押下するごとに、BGRの各成分が0になります。
ボタン4を押すと、画像が元に戻ります。


【ソースコード】


Imports System.Drawing.Imaging

Public Class Form1

 Private bmp As New Bitmap(“C:\aaa.jpg”)
 Private btn(2) As Control
 Private cCnt As Short = 0

 Private Sub Picture_Box(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint

  If bmp Is Nothing Then Exit Sub
  e.Graphics.DrawImage(bmp, 0, 0, PictureBox1.Width, PictureBox1.Height)
  btn(0) = Me.Button1
  btn(1) = Me.Button2
  btn(2) = Me.Button3

 End Sub

 Private Sub pictTransparent(ByVal ind As Integer)

  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)

  For i As Integer = 0 To rgbvaluesSr.Length – 3 Step 3
   rgbvaluesSr(i + ind) = 0
   ’rgbvaluesSr(i + 0) = 0 ‘ B
   ’rgbvaluesSr(i + 1) = 0 ‘ G
   ’rgbvaluesSr(i + 2) = 0 ‘ R
  Next

  System.Runtime.InteropServices.Marshal.Copy(rgbvaluesSr, 0, ptrSr, bytesSr)
  bmp.UnlockBits(bmpSr)

 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
  Button1.Click, Button2.Click, Button3.Click

  For i As Integer = 0 To 2
   If CType(sender, Button) Is btn(i) Then
    pictTransparent(i)
    Exit For
   End If
  Next

  PictureBox1.Invalidate()

 End Sub

 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

  bmp.Dispose()
  bmp = New Bitmap(“C:\aaa.jpg”)
  PictureBox1.Invalidate()

 End Sub

End Class




処理後は、こんな感じになります。
24bppRGBタイプのBitmapの成分は、BGRの順に並んでいるので、
それぞれを0にすることで、上記のような変化が起こります。


関連記事


・画像を読み込み編集する2 (LockBits)


システム開発のためのVB.NETプログラミング関係一覧に戻る


システム開発の【Spread i-Vision】


google検索の結果はこちら