7
我想要在內存中呈現一個需要16位灰度的.NET內存。位圖的格式設置爲PixelFormat.Format16bppGrayScale。但是,Bitmap.SetPixel接受一個Color參數。對於R,B和G(以及可選的A),每個顏色反過來需要一個字節。在.NET中設置單個像素Format16bppGrayScale圖像
當我繪製位圖時,如何指定16位灰度值而不是8位值?
我想要在內存中呈現一個需要16位灰度的.NET內存。位圖的格式設置爲PixelFormat.Format16bppGrayScale。但是,Bitmap.SetPixel接受一個Color參數。對於R,B和G(以及可選的A),每個顏色反過來需要一個字節。在.NET中設置單個像素Format16bppGrayScale圖像
當我繪製位圖時,如何指定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);
注意16bpp的灰度似乎是由GDI +不支持的進行,這意味着.NET不幫忙拯救一個16bpp的灰度位圖文件或流。見http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab
謝謝。我最初使用SetPixel,因爲我只是將512x512位圖寫入文件系統(創建一個通過在垂直軸上旋轉高斯分佈以在另一個程序中使用而創建的實體的高度圖)。對於大多數應用程序來說,SetPixel的優點太慢了。由於您引用的限制,我最終選擇了另一種高度圖格式,但您的答案是正確的並且完全接受。 – 2010-08-17 16:40:07