Export (0) Print
Expand All

How to: Use LockBits

The .NET Compact Framework version 2.0 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 only supports 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 value for the PixelFormat parameter in LockBits.

Example

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

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;
    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

Community Additions

ADD
Show:
© 2014 Microsoft