我正在尝试使用 .NET 在内存中渲染一个需要 16 位灰度的小位图。位图的格式设置为 PixelFormat.Format16bppGrayScale。但是,Bitmap.SetPixel 采用 Color 参数。颜色依次为 R、B 和 G(以及可选的 A)中的每一个占用一个字节。
绘制位图时如何指定 16 位灰度值而不是 8 位值?
无论图像格式如何,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