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
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. –