Maison > développement back-end > C++ > Comment puis-je accélérer le traitement des bitmaps en C# à l'aide de code non sécurisé ou de marshaling ?

Comment puis-je accélérer le traitement des bitmaps en C# à l'aide de code non sécurisé ou de marshaling ?

Patricia Arquette
Libérer: 2025-01-21 13:47:09
original
290 Les gens l'ont consulté

How Can I Speed Up Bitmap Processing in C# Using Unsafe Code or Marshaling?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal