Пиксели человека набора в.NET изображение Format16bppGrayScale

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

Как я указываю 16-разрядное полутоновое значение, а не 8 битовых значений при рисовании к моему битовому массиву?

9
задан Eric J. 13 August 2010 в 06:21
поделиться

1 ответ

Независимо от формата изображения, 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

10
ответ дан 3 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: