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

Wie kann ich Bitmaps in C# effizient bearbeiten?

Patricia Arquette
Freigeben: 2025-01-21 13:36:10
Original
413 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage