Optimierung der Bitmap-Verarbeitung in C#
Einführung
Für Bildverarbeitungsaufgaben ist die effiziente Verarbeitung von Pixeldaten innerhalb von Bitmap-Objekten von entscheidender Bedeutung. Allerdings können die Standardmethoden Bitmap.GetPixel()
und Bitmap.SetPixel()
bei der Verarbeitung großer Bilder erheblich langsam sein. In diesem Artikel werden Techniken zur deutlichen Verbesserung der Leistung durch effiziente Konvertierung von Bitmap-Daten in und aus Byte-Arrays untersucht.
Hochgeschwindigkeits-Bitmap-zu-ByteArray-Konvertierung: Unsicherer Code
Unsicherer Code bietet direkten Speicherzugriff und ermöglicht so eine schnellere Manipulation von Rohpixeldaten. Durch die Verwendung von BitmapData
und LockBits
können Sie einen Zeiger auf die erste Scanlinie der Bitmap erhalten. Die Zeigerarithmetik ermöglicht dann eine effiziente Iteration durch jedes Pixel und greift auf einzelne RGB-Byte-Komponenten zu.
Beispiel für unsicheren Code:
<code class="language-csharp">public unsafe 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(); // ... pixel processing using pointer arithmetic ... b.UnlockBits(bData); return b; }</code>
Verwaltete Bitmap-zu-ByteArray-Konvertierung: Marshalling
Marshaling bietet eine sicherere, verwaltete Alternative zum Konvertieren von Bitmap-Daten in ein Byte-Array. Marshal.Copy()
kopiert Pixeldaten effizient vom BitmapData.Scan0
-Zeiger in ein vorab zugewiesenes Byte-Array. Nach der Verarbeitung werden die geänderten Daten mit der gleichen Methode zurückkopiert.
Marshaling-Beispiel:
<code class="language-csharp">public 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); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); // ... process byte array data ... Marshal.Copy(data, 0, bData.Scan0, data.Length); b.UnlockBits(bData); return b; }</code>
Leistungsanalyse
Die optimale Wahl zwischen unsicherem Code und Marshalling hängt von den Leistungsanforderungen Ihrer Anwendung ab. Unsicherer Code bietet eine höhere Geschwindigkeit, erfordert jedoch eine sorgfältige Handhabung, um Speicherfehler zu vermeiden. Marshalling ist sicherer, aber etwas weniger leistungsfähig. Die beste Methode sollte basierend auf den spezifischen Anforderungen Ihres Projekts ausgewählt werden.
Das obige ist der detaillierte Inhalt vonWie kann ich die Bitmap-Verarbeitung in C# mithilfe von unsicherem Code oder Marshalling beschleunigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!