Domanda

Sto cercando di rendere un piccolo bitmap in memoria con .NET che deve essere a 16 bit in scala di grigi. Il formato del bitmap è impostato su PixelFormat.Format16bppGrayScale. Tuttavia, Bitmap.SetPixel accetta un argomento di colore. Colore a sua volta ha un byte per ciascuno di R, B e G (e opzionalmente A).

Come faccio a specificare un valore di scala di grigi a 16 bit invece che un valore a 8 bit in sede di elaborazione al mio bitmap?

È stato utile?

Soluzione

A prescindere dal formato di immagine, SetPixel() è brutalmente lento. Non uso mai in pratica.

E 'possibile impostare pixel molto più veloce utilizzando il metodo LockBits, che consente di riuscito rapidamente maresciallo dei dati ai byte non gestito bitmap.

Ecco un esempio di come potrebbe apparire che:

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

Si noti che appare 16bpp in scala di grigi di essere supportato da GDI +, il che significa che .NET non aiuta con il salvataggio di una bitmap 16bpp in scala di grigi in un file o un flusso. Vedere http: // sociale. msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top