Partager via


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

Autres ressources

Graphiques et dessins dans le .NET Compact Framework