방법: LockBits 사용
업데이트: 2007년 11월
.NET Compact Framework에서는 관리되지 않는 메모리 버퍼에서 비트맵의 픽셀 배열을 조작한 다음, 비트맵의 픽셀을 버퍼의 픽셀로 바꾸는 데 사용할 수 있는 LockBits 메서드를 지원합니다.
.NET Compact Framework에서는 BitmapData를 매개 변수로 사용하는 LockBits 오버로드를 지원하지 않습니다. ImageLockMode에 대해 ReadWrite, ReadOnly 및 WriteOnly 값을 사용할 수 있습니다. .NET Compact Framework에서는 다음 PixelFormat 값만 지원합니다.
.NET Compact Framework에서는 Image의 PixelFormat 속성을 지원하지 않으므로 LockBits에 format 매개 변수를 사용하여 픽셀 형식 값을 명시적으로 지정해야 합니다.
예제
다음 예제에서는 비트맵을 만들고 LockBits를 사용하여 연속한 파란색 픽셀의 농도를 변경합니다.
'Call method from OnPaint.
Protected Overrides Sub OnPaint(e As PaintEventArgs)
LockUnlockBits(e)
End Sub
Private Sub LockUnlockBits(e As PaintEventArgs)
Dim bmp As New Bitmap(".\test.bmp")
' Specify a pixel format.
Dim pxf As PixelFormat = Pixelformat.Format24bppRgb
' Lock the bitmap's bits.
Dim rect As Rectangle = New Rectangle(0,0,bmp.Width,Bmp.Height)
Dim bmpData As BitmapData = bmp.LockBits(rect, _
ImageLockMOde.ReadWrite, pxf)
'Get the address of the first line of the bitmap.
Dim ptr As IntPtr = bmpData.Scan0
' Declare an array to hold the bytes of the bitmap.
' Dim numBytes as Integer = bmp.Width * bmp.Height * 3
Dim numBytes as Integer = bmpData.Stride * bmp.Height
Dim rgbValues(numBytes) As Byte
' Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, numBytes)
' Manipulate the bitmap, such as changing the
' blue value for every other pixel in the the bitmap.
For counter As Integer = 0 To rgbValues.Length Step 6
rgbValues(counter) = 255
Next counter
' Copy the RGB values back to the bitmap
Marshal.Copy(rgbValues, 0, ptr, numBytes)
' Unlock the bits.
bmp.UnlockBits(bmpData)
' Draw the modified image.
e.Graphics.DrawImage(bmp, 0, 0)
e.Graphics.Dispose()
End Sub
private Bitmap CreateBitmap(int width, int height, string s)
{
Bitmap bmp = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.LightCoral), 0, 0, bmp.Width, bmp.Height);
g.DrawRectangle(new Pen(Color.Green, 10), 5, 5, bmp.Width - 10, bmp.Height - 10);
g.DrawLine(new Pen(Color.Yellow, 15), 0, 0, bmp.Width, bmp.Height);
g.DrawLine(new Pen(Color.Yellow, 15), bmp.Width, 0, 0, bmp.Height);
SizeF size = g.MeasureString(s, this.Font);
g.DrawString(s, this.Font, new SolidBrush(Color.Black),
(bmp.Width - size.Width) / 2,
(bmp.Height - size.Height) / 2);
g.Dispose();
return bmp;
}
protected override void OnPaint(PaintEventArgs e)
{
Bitmap bmp = CreateBitmap(100, 100, "Hi Mom!");
e.Graphics.DrawImage(bmp, 0, 0);
MakeMoreBlue(bmp);
// Draw the modified image to the right of the original one
e.Graphics.DrawImage(bmp, 120, 0);
bmp.Dispose();
}
private void MakeMoreBlue(Bitmap bmp)
{
// Specify a pixel format.
PixelFormat pxf = PixelFormat.Format24bppRgb;
// Lock the bitmap's bits.
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData =
bmp.LockBits(rect, ImageLockMode.ReadWrite,
pxf);
// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;
// Declare an array to hold the bytes of the bitmap.
// int numBytes = bmp.Width * bmp.Height * 3;
int numBytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[numBytes];
// Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, numBytes);
// Manipulate the bitmap, such as changing the
// blue value for every other pixel in the the bitmap.
for(int counter = 0; counter < rgbValues.Length; counter+=6)
rgbValues[counter] = 255;
// Copy the RGB values back to the bitmap
Marshal.Copy(rgbValues, 0, ptr, numBytes);
// Unlock the bits.
bmp.UnlockBits(bmpData);
}
코드 컴파일
이 예제에는 다음과 같은 네임스페이스에 대한 참조가 필요합니다.