Maison >développement back-end >C++ >Comment puis-je accélérer la manipulation des bitmaps en C# ?

Comment puis-je accélérer la manipulation des bitmaps en C# ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-21 13:41:09580parcourir

How Can I Speed Up Bitmap Manipulation in C#?

Améliorer les performances des bitmaps en C#

Pour les applications exigeant des vitesses de traitement d'image élevées, l'optimisation de la manipulation des données de pixels Bitmap est essentielle. Si Bitmap.GetPixel() et Bitmap.SetPixel() suffisent pour des tâches simples, la gestion d'images volumineuses ou de modifications fréquentes nécessite une approche plus efficace.

Accès direct aux données de pixels

Modifier efficacement des pixels individuels implique de convertir le Bitmap en un tableau d'octets. Ceci est mieux réalisé en utilisant LockBits ou le marshaling.

La LockBitsTechnique :

BitmapData.LockBits() fournit un pointeur de mémoire direct vers les données de pixels, permettant un accès rapide. Cependant, cela nécessite l'utilisation de code non sécurisé et le verrouillage explicite du Bitmap. Exemple :

<code class="language-csharp">unsafe Image ThresholdUA(Image image, float thresh)
{
    Bitmap b = new Bitmap(image);
    BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);

    byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
    byte* scan0 = (byte*)bData.Scan0.ToPointer();

    // Pixel manipulation loop using scan0 pointer...
}</code>

Marshaling pour un accès sécurisé :

System.Runtime.InteropServices.Marshal.Copy() offre une alternative plus sûre, en transférant les données de pixels vers un tableau d'octets sans code dangereux. Voici comment :

<code class="language-csharp">Image ThresholdMA(Image image, float thresh)
{
    Bitmap b = new Bitmap(image);
    BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);

    byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
    int size = bData.Stride * bData.Height;
    byte[] data = new byte[size];

    System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, data, 0, size);

    // Pixel manipulation loop using data array...
}</code>

Comparaison des performances :

LockBits surpasse généralement le marshaling en raison de son accès direct à la mémoire. Cependant, le marshaling évite le code dangereux, ce qui le rend préférable dans certains contextes.

Conclusion :

La conversion de bitmaps en tableaux d'octets à l'aide de LockBits ou du marshaling améliore considérablement l'efficacité de la manipulation des pixels, en particulier pour les images volumineuses ou fréquemment traitées. Choisissez la méthode qui équilibre le mieux les exigences de performances et de sécurité du code.

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!

Déclaration:
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