Optimisation de la manipulation des bitmaps C# : alternatives aux lenteurs SetPixel
et GetPixel
Présentation
Les méthodes intégrées GetPixel
et SetPixel
en C# pour la manipulation de bitmaps sont notoirement lentes, en particulier lorsqu'il s'agit d'images plus grandes. Cet article présente des alternatives supérieures pour des performances considérablement améliorées.
Alternatives hautes performances
Trois méthodes principales offrent des améliorations de vitesse substantielles par rapport aux fonctions standard :
Classe DirectBitmap : Cette classe personnalisée fournit un accès direct et non géré aux données bitmap, éliminant ainsi la surcharge de verrouillage et de copie. Il propose des méthodes GetPixel
et SetPixel
pour une manipulation intuitive des pixels.
Méthode LockBits : Cette méthode intégrée verrouille une section du bitmap en mémoire pour un accès direct à ses données brutes. Bien que plus rapide que SetPixel
/GetPixel
, il nécessite un verrouillage et un déverrouillage explicites, ce qui entraîne un faible coût en termes de performances.
Blocs de code non sécurisés : Cette approche utilise des pointeurs non sécurisés pour la manipulation directe de la mémoire. Bien que potentiellement le plus rapide, il nécessite une manipulation minutieuse pour éviter la corruption de la mémoire ; cette méthode est la mieux adaptée aux développeurs expérimentés.
Références de performances
Les performances varient en fonction de la taille de l'image et de l'opération spécifique. Généralement, DirectBitmap
surpasse LockBits
et surpasse considérablement SetPixel
/GetPixel
pour les bitmaps plus grands. Le tableau suivant illustre les différences de performances :
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 |
Exemple de code : DirectBitmap
La classe DirectBitmap
simplifie l'accès aux pixels :
<code class="language-csharp">public void SetPixel(int x, int y, Color colour) public Color GetPixel(int x, int y)</code>
Exemple d'utilisation :
<code class="language-csharp">var dbm = new DirectBitmap(width, height); dbm.SetPixel(x, y, Color.Red); Color c = dbm.GetPixel(x, y);</code>
Conclusion
Pour des performances optimales avec de grands bitmaps, la classe DirectBitmap
fournit une solution convaincante, offrant des améliorations de vitesse significatives par rapport aux méthodes traditionnelles. LockBits
présente un compromis équilibré entre vitesse et facilité d'utilisation, tandis qu'un code dangereux, bien que potentiellement le plus rapide, exige une mise en œuvre minutieuse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!