2010-08-13 16 views
7

Estoy tratando de renderizar un pequeño mapa de bits en la memoria con .NET que debe ser de 16 bits en escala de grises. El formato del mapa de bits se establece en PixelFormat.Format16bppGrayScale. Sin embargo, Bitmap.SetPixel toma un argumento Color. El color a su vez toma un byte para cada uno de R, B y G (y opcionalmente A).Establecer píxeles individuales en .NET Format16bppGrayScale image

¿Cómo especifico un valor de escala de grises de 16 bits en lugar de un valor de 8 bits cuando dibujo a mi mapa de bits?

Respuesta

8

Independientemente del formato de imagen, SetPixel() es brutalmente lento. Nunca lo uso en la práctica.

Puede establecer píxeles mucho más rápido utilizando el método LockBits, que le permite Mariscal rápidamente los datos gestionados para los bytes de mapa de bits no administrados.

Aquí es un ejemplo de cómo podría mirar:

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); 

Tenga en cuenta que la escala de grises 16bpp parece estar no soportado por GDI +, es decir, que .NET no ayuda a cabo con el ahorro de un mapa de bits de escala de grises 16bpp a un archivo o una corriente. Ver http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab

+0

Gracias. Originalmente fui con SetPixel ya que solo estaba escribiendo un mapa de bits de 512x512 en el sistema de archivos (creando un mapa de altura de un sólido creado al rotar una distribución gaussiana alrededor del eje vertical para usar en otro programa). Buen punto acerca de que SetPixel es demasiado lento para la mayoría de las aplicaciones. En última instancia, fui con otro formato de mapa de alturas debido a las limitaciones a las que hace referencia, pero su respuesta es correcta y completa, por lo que la acepto. –

Cuestiones relacionadas