Comment : utiliser LockBits
Mise à jour : novembre 2007
Le .NET Compact Framework prend en charge la méthode LockBits qui vous permet de manipuler le tableau de pixels d'une bitmap dans une mémoire tampon non managée, puis de remplacer les pixels dans la bitmap par les pixels de la mémoire tampon.
Le .NET Compact Framework ne prend pas en charge la surcharge LockBits qui accepte BitmapData comme paramètre. Vous pouvez utiliser les valeurs ReadWrite, ReadOnly et WriteOnly pour ImageLockMode. Le .NET Compact Framework prend en charge uniquement les valeurs PixelFormat suivantes :
Notez que dans la mesure où le .NET Compact Framework ne prend pas en charge la propriété PixelFormat de Image, vous devez spécifier explicitement sa valeur de format de pixel à l'aide du paramètre format dans LockBits.
Exemple
L'exemple suivant crée une bitmap et utilise LockBits pour modifier l'intensité d'une série de pixels bleus.
'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);
}
Compilation du code
Cet exemple nécessite des références aux espaces de noms suivants :
Voir aussi
Tâches
Comment : dessiner des images hors écran