How to: Use LockBits

The .NET Compact Framework provides support for the LockBits method, which enables you to manipulate a bitmap's array of pixels in an unmanaged memory buffer and then replace the pixels in the bitmap with the pixels from the buffer.

The .NET Compact Framework does not support the LockBits overload that takes a BitmapData as a parameter. You can use the ReadWrite, ReadOnly, and WriteOnly values for the ImageLockMode. The .NET Compact Framework supports only the following PixelFormat values:

Note that because the .NET Compact Framework does not support the PixelFormat property of an Image, you must explicitly specify its pixel format value by using the format parameter in LockBits.

Example

The following example creates a bitmap and uses LockBits to change the intensity of a series of blue pixels.

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

Compiling the Code

This example requires references to the following namespaces:

See Also

Tasks

How to: Draw Images Off-Screen

Other Resources

Graphics and Drawing in the .NET Compact Framework