Heim >Backend-Entwicklung >C++ >Wie kann ich Bitmaps in C# effizient bearbeiten?

Wie kann ich Bitmaps in C# effizient bearbeiten?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-21 13:36:10493Durchsuche

How Can I Efficiently Manipulate Bitmaps in C#?

Schnelle Bitmap-Verarbeitung in C#

Beim Arbeiten mit großen Bitmaps kann der Zugriff und die Ausführung von Vorgängen auf Pixel-für-Pixel-Basis Auswirkungen auf die Leistung haben. Die in C# integrierten Methoden Bitmap.GetPixel() und Bitmap.SetPixel() sind praktisch, aber langsam. In diesem Artikel werden alternative Möglichkeiten zur schnellen Konvertierung einer Bitmap in ein Byte-Array und zurück in eine Bitmap untersucht, um effiziente Pixeloperationen zu ermöglichen.

Bitmap in Byte-Array konvertieren

  • LockBits-Methode: Diese Methode ermöglicht den direkten Zugriff auf den internen Datenpuffer der Bitmap. Durch die Verwendung von unsicherem Code können Sie als Zeiger auf die Rohpixeldaten zugreifen und so schnelle Vorgänge ermöglichen. Dieser Ansatz erfordert jedoch eine sorgfältige Speicherverwaltung.
  • Marshalling: Marshalling umfasst das Kopieren von Daten zwischen verwaltetem und nicht verwaltetem Speicher. Mit der Methode Marshal.Copy() können Sie Pixeldaten aus einem Bitmap-Puffer in ein Byte-Array kopieren. Obwohl für das Marshalling kein unsicherer Code erforderlich ist, ist es möglicherweise etwas langsamer als die LockBits-Methode.

Byte-Array in Bitmap konvertieren

  • LockBits-Methode: Nachdem die Pixeldaten im Byte-Array geändert wurden, können sie über die LockBits-Methode zurück in die Bitmap kopiert werden. Dies ähnelt der Konvertierung einer Bitmap in ein Byte-Array.
  • Marshalling: Mit der Methode Marshal.Copy() können Sie geänderte Pixeldaten aus einem Byte-Array zurück in einen Bitmap-Puffer kopieren.

Leistungsvergleich

  • LockBits: schneller, erfordert unsicheren Code
  • Marshaling: Langsamer, aber kein unsicherer Code erforderlich

Beispiel für die LockBits-Methode

<code class="language-csharp">using System;
using System.Drawing;
using System.Runtime.InteropServices;

public unsafe class FastBitmap
{
    public static Image ThresholdUA(float thresh)
    {
        Bitmap b = new Bitmap(_image);

        BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);

        byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);

        byte* scan0 = (byte*)bData.Scan0.ToPointer();

        for (int i = 0; i < ... }</code>

Beispiel einer Marshalling-Methode

<code class="language-csharp">using System;
using System.Drawing;
using System.Runtime.InteropServices;

public class FastBitmap
{
    public static Image ThresholdMA(float thresh)
    {
        Bitmap b = new Bitmap(_image);

        BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);

        byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);

        int size = bData.Stride * bData.Height;

        byte[] data = new byte[size];

        Marshal.Copy(bData.Scan0, data, 0, size);

        for (int i = 0; i < ... }</code>

Das obige ist der detaillierte Inhalt vonWie kann ich Bitmaps in C# effizient bearbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn