Установите отдельные пиксели в изображении .NET Format16bppGrayScale - PullRequest
9 голосов
/ 13 августа 2010

Я пытаюсь визуализировать небольшое растровое изображение в памяти с помощью .NET, которое должно быть 16-битным оттенком серого. Формат растрового изображения установлен на PixelFormat.Format16bppGrayScale. Однако Bitmap.SetPixel принимает аргумент Color. Цвет, в свою очередь, занимает один байт для каждого из R, B и G (и, возможно, A).

Как указать 16-битное значение серой шкалы, а не 8-битное при рисовании на моем растровом изображении?

1 Ответ

10 голосов
/ 17 августа 2010

Независимо от формата изображения, SetPixel() крайне медленный.Я никогда не использую его на практике.

Вы можете установить пиксели намного быстрее, используя метод LockBits, который позволяет быстро упорядочить управляемые данные в неуправляемые битовые биты.

Вот пример того, какэто может выглядеть следующим образом:

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

Обратите внимание, что оттенки серого 16bpp, по-видимому, не поддерживаются GDI +, а это означает, что .NET не помогает с сохранением растрового изображения в оттенках серого 16bpp в файл или поток.Смотри http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab

...