Como: Usar LockBits
The .NET Compact Framework Fornece suporte para o LockBits método, que permite manipular uma matriz de um bitmap de pixels em um buffer de memória não gerenciada e depois substituir os pixels no bitmap com os pixels do buffer.
The .NET Compact Framework não oferece suporte a LockBits sobrecarga que aceita um BitmapData sistema autônomo um parâmetro. Você pode usar o ReadWrite, ReadOnly, e WriteOnly os valores para o ImageLockMode. The .NET Compact Framework suporta apenas o seguinte PixelFormat valores:
Observe que, porque o .NET Compact Framework não oferece suporte a PixelFormat propriedade de um Image, você deve especificar explicitamente seu valor de formato de pixel usando o format parâmetro em LockBits.
Exemplo
O exemplo a seguir cria um bitmap e usa LockBits Para alterar a intensidade de uma série de pixels azuis.
'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);
}
Compilando o código
Este exemplo requer referências aos seguintes namespaces:
Consulte também
Tarefas
Como: Desenhar imagens off-tela