Optimisation du traitement Bitmap en C#
Présentation
Pour les tâches de traitement d'image, une gestion efficace des données de pixels dans les objets Bitmap est essentielle. Cependant, les méthodes standard Bitmap.GetPixel()
et Bitmap.SetPixel()
peuvent être considérablement lentes lorsqu'il s'agit de grandes images. Cet article explore les techniques permettant d'améliorer considérablement les performances en convertissant efficacement les données Bitmap vers et depuis des tableaux d'octets.
Conversion Bitmap haute vitesse en ByteArray : code dangereux
Le code non sécurisé offre un accès direct à la mémoire, permettant une manipulation plus rapide des données brutes des pixels. En utilisant BitmapData
et LockBits
, vous pouvez obtenir un pointeur vers la première ligne de balayage du Bitmap. L'arithmétique du pointeur permet ensuite une itération efficace sur chaque pixel, accédant aux composants d'octets RVB individuels.
Exemple de code dangereux :
<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>
Conversion de bitmap géré en ByteArray : marshaling
Le marshaling offre une alternative plus sûre et gérée pour convertir les données Bitmap en un tableau d'octets. Marshal.Copy()
copie efficacement les données de pixels du pointeur BitmapData.Scan0
vers un tableau d'octets pré-alloué. Après traitement, les données modifiées sont recopiées selon la même méthode.
Exemple de marshaling :
<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>
Analyse des performances
Le choix optimal entre le code non sécurisé et le marshaling dépend des besoins de performances de votre application. Le code non sécurisé offre une vitesse supérieure mais nécessite une manipulation minutieuse pour éviter les erreurs de mémoire. Le marshaling est plus sûr mais légèrement moins performant. La meilleure méthode doit être sélectionnée en fonction des exigences spécifiques de votre projet.
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!