在.NET Format16bppGrayScale图像中设置单个像素

时间:2010-08-13 06:31:18

标签: .net graphics bitmap grayscale

我正在尝试使用需要16位灰度的.NET在内存中渲染一个小的Bitmap。位图的格式设置为PixelFormat.Format16bppGrayScale。但是,Bitmap.SetPixel采用Color参数。颜色依次为R,B和G(以及可选的A)中的每一个取一个字节。

绘制到我的位图时,如何指定16位灰度值而不是8位值?

1 个答案:

答案 0 :(得分:9)

无论图像格式如何,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);

请注意,GDI +似乎不支持16bpp灰度,这意味着.NET无法帮助将16bpp灰度位图保存到文件或流中。见http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab