Conseils pour améliorer les performances du traitement bitmap C#
L'accès direct aux pixels bitmap et leur modification est une opération gourmande en calcul, en particulier lors de l'utilisation des méthodes standard Bitmap.GetPixel()
et Bitmap.SetPixel()
. Pour améliorer les performances, envisagez les techniques suivantes :
Convertir le bitmap en tableau d'octets et inversement
Pour des opérations par lots rapides sur les pixels bitmap, vous pouvez convertir le bitmap en un tableau d'octets et traiter directement les données brutes des pixels. Cela peut réduire considérablement le temps d'exécution en évitant la surcharge liée aux accès aux pixels individuels.
Le code suivant montre comment convertir un bitmap en tableau d'octets :
<code class="language-csharp">public static byte[] BitmapToByteArray(Bitmap bitmap) { int size = bitmap.Width * bitmap.Height * 4; // 假设为32位RGBA格式 byte[] data = new byte[size]; BitmapData bData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Marshal.Copy(bData.Scan0, data, 0, size); return data; }</code>
Le code suivant montre comment reconvertir un tableau d'octets en bitmap :
<code class="language-csharp">public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height) { int size = width * height * 4; // 假设为32位RGBA格式 Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); BitmapData bData = bitmap.LockBits( new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); Marshal.Copy(data, 0, bData.Scan0, size); return bitmap; }</code>
Utilisez un code non sécurisé pour accéder directement aux données de pixels
Pour de meilleures performances, vous pouvez utiliser du code non sécurisé pour accéder directement aux données de pixels bitmap. Cela évite les frais généraux de marshaling et offre la vitesse d’accès la plus rapide possible.
Le code suivant montre un exemple d'utilisation de code non sécurisé pour modifier les pixels bitmap :
<code class="language-csharp">public unsafe void ModifyPixelsUnsafe(Bitmap bitmap) { BitmapData bData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // ... 直接操作 scan0 指针访问像素数据 ... }</code>
Veuillez noter que le code non sécurisé doit être utilisé avec prudence car il peut entraîner une corruption de la mémoire s'il est utilisé incorrectement.
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!