Heim >Backend-Entwicklung >C++ >Wie kann ich die Bitmap-Manipulation in C# über „SetPixel' und „GetPixel' hinaus beschleunigen?
Optimierung der C#-Bitmap-Manipulation: Alternativen zu Slow SetPixel
und GetPixel
Einführung
Die in C# integrierten Methoden GetPixel
und SetPixel
zur Bitmap-Manipulation sind bekanntermaßen langsam, insbesondere beim Umgang mit größeren Bildern. Dieser Artikel stellt überlegene Alternativen für eine deutlich verbesserte Leistung vor.
Hochleistungsalternativen
Drei Hauptmethoden bieten erhebliche Geschwindigkeitsverbesserungen gegenüber den Standardfunktionen:
DirectBitmap-Klasse: Diese benutzerdefinierte Klasse bietet direkten, nicht verwalteten Zugriff auf Bitmap-Daten, wodurch der Aufwand für das Sperren und Kopieren entfällt. Es bietet GetPixel
und SetPixel
Methoden zur intuitiven Pixelmanipulation.
LockBits-Methode: Diese integrierte Methode sperrt einen Abschnitt der Bitmap im Speicher für den direkten Zugriff auf ihre Rohdaten. Es ist zwar schneller als SetPixel
/GetPixel
, erfordert jedoch ein explizites Sperren und Entsperren, was zu geringen Leistungseinbußen führt.
Unsichere Codeblöcke: Dieser Ansatz nutzt unsichere Zeiger für die direkte Speichermanipulation. Obwohl es möglicherweise das schnellste ist, erfordert es eine sorgfältige Handhabung, um eine Speicherbeschädigung zu verhindern. Diese Methode eignet sich am besten für erfahrene Entwickler.
Leistungsbenchmarks
Die Leistung variiert je nach Bildgröße und dem jeweiligen Vorgang. Im Allgemeinen übertrifft DirectBitmap
LockBits
und übertrifft SetPixel
/GetPixel
bei größeren Bitmaps erheblich. Die folgende Tabelle veranschaulicht die Leistungsunterschiede:
Method | 4x4 | 16x16 | 64x64 | 256x256 | 1024x1024 | 4096x4096 |
---|---|---|---|---|---|---|
DirectBitmap | 2 | 28 | 668 | 8219 | 178639 | |
LockBits | 2 | 3 | 33 | 670 | 9612 | 197115 |
SetPixel | 45 | 371 | 5920 | 97477 | 1563171 | 25811013 |
Codebeispiel: DirectBitmap
Die DirectBitmap
-Klasse vereinfacht den Pixelzugriff:
<code class="language-csharp">public void SetPixel(int x, int y, Color colour) public Color GetPixel(int x, int y)</code>
Anwendungsbeispiel:
<code class="language-csharp">var dbm = new DirectBitmap(width, height); dbm.SetPixel(x, y, Color.Red); Color c = dbm.GetPixel(x, y);</code>
Fazit
Für optimale Leistung bei großen Bitmaps bietet die DirectBitmap
-Klasse eine überzeugende Lösung, die im Vergleich zu herkömmlichen Methoden erhebliche Geschwindigkeitsverbesserungen bietet. LockBits
stellt einen ausgewogenen Kompromiss zwischen Geschwindigkeit und Benutzerfreundlichkeit dar, während unsicherer Code, obwohl potenziell am schnellsten, eine sorgfältige Implementierung erfordert.
Das obige ist der detaillierte Inhalt vonWie kann ich die Bitmap-Manipulation in C# über „SetPixel' und „GetPixel' hinaus beschleunigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!