Quel que soit le format de l'image, SetPixel()
est brutalement lent. Je ne l'utilise jamais en pratique.
Vous pouvez définir les pixels beaucoup plus rapidement à l'aide de la méthode LockBits, qui vous permet d'acheminer rapidement les données gérées vers les octets non gérés du bitmap.
Voici un exemple de ce que cela pourrait donner :
Bitmap bitmap = // ...
// Lock the unmanaged bits for efficient writing.
var data = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);
// Bulk copy pixel data from a byte array:
Marshal.Copy(byteArray, 0, data.Scan0, byteArray.Length);
// Or, for one pixel at a time:
Marshal.WriteInt16(data.Scan0, offsetInBytes, shortValue);
// When finished, unlock the unmanaged bits
bitmap.UnlockBits(data);
Notez que les niveaux de gris 16bpp ne semblent pas être pris en charge par GDI+, ce qui signifie que .NET n'aide pas à sauvegarder un bitmap en niveaux de gris 16bpp dans un fichier ou un flux. Voir http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab