如何:使用 LockBits

更新:2007 年 11 月

.NET Compact Framework 支持 LockBits 方法,通过该方法,可以在非托管的内存缓冲区中操作位图的像素数组,然后将位图像素替换为缓冲区像素。

.NET Compact Framework 不支持以 BitmapData 为参数的 LockBits 重载。您可以对 ImageLockMode 使用 ReadWriteReadOnlyWriteOnly 值。.NET Compact Framework 只支持以下 PixelFormat 值:

请注意,由于 .NET Compact Framework 不支持 ImagePixelFormat 属性,因此必须在 LockBits 中使用 format 参数显式指定其像素格式值。

示例

下面的示例创建一个位图,然后使用 LockBits 来更改一系列蓝色像素的亮度。

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

编译代码

此示例需要引用下面的命名空间:

请参见

任务

如何:绘制后台图像

其他资源

.NET Compact Framework 中的图形和绘图