Tipps zur Verbesserung der C#-Bitmap-Verarbeitungsleistung
Der direkte Zugriff auf und die Änderung von Bitmap-Pixeln ist ein rechenintensiver Vorgang, insbesondere bei Verwendung der Standardmethoden Bitmap.GetPixel()
und Bitmap.SetPixel()
. Um die Leistung zu verbessern, sollten Sie die folgenden Techniken in Betracht ziehen:
Bitmap in Byte-Array konvertieren und zurück
Für schnelle Stapeloperationen an Bitmap-Pixeln können Sie die Bitmap in ein Byte-Array konvertieren und die rohen Pixeldaten direkt verarbeiten. Dadurch kann die Laufzeit erheblich verkürzt werden, da der Overhead einzelner Pixelzugriffe vermieden wird.
Der folgende Code zeigt, wie eine Bitmap in ein Byte-Array konvertiert wird:
<code class="language-csharp">public static byte[] BitmapToByteArray(Bitmap bitmap) { int size = bitmap.Width * bitmap.Height * 4; // 假设为32位RGBA格式 byte[] data = new byte[size]; BitmapData bData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Marshal.Copy(bData.Scan0, data, 0, size); return data; }</code>
Der folgende Code zeigt, wie ein Byte-Array zurück in eine Bitmap konvertiert wird:
<code class="language-csharp">public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height) { int size = width * height * 4; // 假设为32位RGBA格式 Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); BitmapData bData = bitmap.LockBits( new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); Marshal.Copy(data, 0, bData.Scan0, size); return bitmap; }</code>
Verwenden Sie unsicheren Code, um direkt auf Pixeldaten zuzugreifen
Für eine optimale Leistung können Sie unsicheren Code verwenden, um direkt auf Bitmap-Pixeldaten zuzugreifen. Dies vermeidet den Mehraufwand des Marshallings und sorgt für die schnellstmögliche Zugriffsgeschwindigkeit.
Der folgende Code zeigt ein Beispiel für die Verwendung von unsicherem Code zum Ändern von Bitmap-Pixeln:
<code class="language-csharp">public unsafe void ModifyPixelsUnsafe(Bitmap bitmap) { BitmapData bData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // ... 直接操作 scan0 指针访问像素数据 ... }</code>
Bitte beachten Sie, dass unsicherer Code mit Vorsicht verwendet werden sollte, da er bei falscher Verwendung zu Speicherbeschädigungen führen kann.
Das obige ist der detaillierte Inhalt vonWie kann ich die Bitmap-Manipulation in C# für eine bessere Leistung optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!