11 votes

Définir des pixels individuels dans une image Format16bppGrayScale .NET

J'essaie d'effectuer le rendu d'un petit bitmap en mémoire avec .NET qui doit être en niveaux de gris 16 bits. Le format du bitmap est défini sur PixelFormat.Format16bppGrayScale. Cependant, Bitmap.SetPixel prend un argument Couleur. La couleur prend à son tour un octet pour chacun de R, B et G (et éventuellement A).

Comment puis-je spécifier une valeur d'échelle de gris de 16 bits plutôt qu'une valeur de 8 bits lorsque je dessine sur mon bitmap ?

12voto

kbrimington Points 14081

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X