SO WIRD'S GEMACHT: LockBits verwenden

Dieser Dokumentation für die Vorschau nur ist und in späteren Versionen geändert. Leere Themen wurden als Platzhalter eingefügt.]

.NET Compact Framework bietet Unterstützung für die LockBits-Methode, die können Sie eine Bitmap-Array von Pixel in einer nicht verwalteten Speicherpuffer zu bearbeiten, und Ersetzen Sie die Pixel in der Bitmap durch die Pixel aus dem Puffer.

.NET Compact Framework Überladung unterstützt, die akzeptiert als Parameter ein LockBitsBitmapData nicht. Sie können die ReadWrite, ReadOnlyund WriteOnly Werte für ImageLockMode verwenden. .NET Compact Framework unterstützt nur die folgenden PixelFormat Werte:

Beachten Sie, dass da .NET Compact Framework Eigenschaft die ein PixelFormatImagenicht unterstützt, Sie explizit seine Format Pixelwert angeben müssen mithilfe des format Parameters in LockBits.

Beispiel

Das folgende Beispiel erstellt eine Bitmap und verwendet LockBits, um die Intensität einer Reihe blauer Pixel zu ändern.

                        'Call method from OnPaint.
                        Protected
                        Overrides
                        Sub OnPaint(e As PaintEventArgs)
    LockUnlockBits(e)
EndSubPrivateSub LockUnlockBits(e As PaintEventArgs)
    Dim bmp AsNew 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 * 3Dim numBytes as Integer = bmpData.Stride * bmp.Height
    Dim rgbValues(numBytes) AsByte
    ' 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 AsInteger = 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()
EndSub
                        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;
}


protectedoverridevoid 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();
}


privatevoid 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 = newbyte[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);
}

Kompilieren des Codes

In diesem Beispiel sind Verweise auf die folgenden Namespaces erforderlich:

Siehe auch

Aufgaben

SO WIRD'S GEMACHT: Zeichnen Sie Bilder Off-Screen

Weitere Ressourcen

Grafik und Zeichnen in .NET Compact Framework