SetPixel
et GetPixel
sont fréquemment utilisés pour la manipulation de Bitmap au niveau des pixels dans Windows Forms, mais leurs performances sont notoirement médiocres, en particulier avec des images plus grandes ou des opérations fréquentes. Cet article explore des alternatives plus rapides.
La classe DirectBitmap
Une solution très efficace est la classe DirectBitmap
. Cette classe utilise une mémoire épinglée, accordant un accès direct aux données bitmap sans avoir besoin de LockBits
ou SetPixel
. Cet accès direct aux données bitmap brutes améliore considérablement les performances.
Données de pixels brutes basées sur les octets
Une optimisation supplémentaire peut être obtenue en représentant les données brutes de pixels sous forme d'octets au lieu d'entiers. Cela déplace le format des données vers ARGB (Alpha/Rouge/Vert/Bleu), chaque pixel consommant 4 octets. Cela nécessite d'adapter les fonctions GetPixel
et SetPixel
en conséquence.
L'utilisation de la classe DirectBitmap
offre des avantages clés :
IDisposable
, similaire à Bitmap
, minimisant les frais de gestion des objets.unsafe
bloc de code n'est nécessaire.La mémoire épinglée, telle qu'utilisée par DirectBitmap
, a une limitation : elle est immobile. Cette caractéristique inhérente à l’accès à la mémoire épinglée peut affecter l’efficacité du garbage collection. Par conséquent, utilisez cette technique judicieusement, uniquement lorsque les performances sont critiques, et veillez toujours à une élimination appropriée pour débloquer la mémoire.
Malgré l'accès direct fourni par DirectBitmap
, l'objet Graphics
reste un outil viable pour la manipulation de bitmaps.
Une comparaison de DirectBitmap
, LockBits
et SetPixel
révèle des écarts de performances substantiels, en particulier pour les images plus grandes :
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 |
La classe DirectBitmap
surpasse clairement LockBits
et SetPixel
, surtout lorsqu'il s'agit d'images plus grandes.
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!