Cómo: Utilizar el control LockBits

Actualización: noviembre 2007

.NET Compact Framework agrega compatibilidad con el método LockBits, que permite manipular una matriz de píxeles de un mapa de bits en un búfer de memoria no administrado y, a continuación, sustituir los píxeles del mapa de bits por los píxeles de búfer.

.NET Compact Framework no admite la sobrecarga de LockBits que toma BitmapData como parámetro. Se pueden utilizar los valores de ReadWrite, ReadOnly y WriteOnly para ImageLockMode. .NET Compact Framework sólo admite los siguientes valores de PixelFormat:

Tenga en cuenta que dado que .NET Compact Framework no admite la propiedad PixelFormat de un objeto Image, debe especificar de forma explícita el valor del formato de píxel utilizando el parámetro format en el método LockBits.

Ejemplo

En el ejemplo siguiente se crea un mapa de bits y se utiliza LockBits para cambiar la intensidad de una serie de píxeles azules.

'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);
}

Compilar el código

Para este ejemplo se requieren referencias a los siguientes espacios de nombres:

Vea también

Tareas

Cómo: Dibujar imágenes fuera de la pantalla

Otros recursos

Gráficos y dibujos en .NET Compact Framework