![](/img/trans.png)
[英]Convert Image 16bits grayscale to Bitmap 16bits grayscale (Constructor error)
[英]Structure for holding a 16bits grayscale image
我需要屏蔽來自 memory 緩沖區的圖像(用黑色填充的矩形區域)。 因此,我天真地將Bitmap class 與ImageFormat.MemoryBmp一起用於我的 API。這在我的本地機器上運行良好:
public static void MaskBitmap(Bitmap input, Rectangle maskRegion)
{
var bytesPerPixel = Image.GetPixelFormatSize(input.PixelFormat) / 8;
var row = new byte[maskRegion.Width * bytesPerPixel];
var maskData = input.LockBits(maskRegion, ImageLockMode.WriteOnly, input.PixelFormat);
for (var i = 0; i < maskData.Height; ++i)
{
Marshal.Copy(row, 0, maskData.Scan0 + (i * maskData.Stride), row.Length);
}
input.UnlockBits(maskData);
}
然而,當部署到生產環境時,發現以下拋出NotImplementedException
:
var image16 = new Bitmap(512, 512, PixelFormat.Format16bppGrayScale);
我最終追蹤到了這里:
所以我的問題是:c# 中是否有任何現有的 class 我可以重新使用來保存像素格式類型的圖像:
我知道 GDI+不支持保存/顯示16 位圖像,我只需要一個具有圖像樣式訪問權限的 memory 結構。
僅供參考,我嘗試了以下技巧:
var image = new Bitmap(512,512,PixelFormat.Format24bppRgb);
image.Flags = ImageFlags.ColorSpaceGray;
但是Flags
是只讀的。
我認為Wpf 位圖應該支持 16 位灰度。
但是,我處理過的大多數使用 16 位灰度圖像的系統都使用自定義數據類型。 就像是:
public class My16BitImage{
public ushort[] Data {get;}
public int Width {get;}
public int Height {get;}
}
請注意,為了顯示圖像,您很可能無論如何都需要將其轉換為 8 位圖像,並且您可能需要縮放值以使最大/最小值 map 成為最大/最小 8 位值。
如您所見,GDI+ Bitmap
在 Linux 上根本不支持 16bpp 灰度像素格式,實際上它在 Windows 上的支持也非常有限。 在我收集了兩個平台的限制后,請參閱此處“不同平台上可能的像素格式的限制”部分下的表格。
我需要屏蔽來自 memory 個緩沖區的圖像
要在 Linux 和 Windows 上使用 bitmap 的完全托管內存表示,您可以使用此庫(免責聲明:由我編寫)。 您可以通過BitmapDataFactory.CreateBitmapData
方法創建一個 16bpp 灰度 bitmap 數據,該方法返回一個允許大量托管操作的IReadWriteBitmapData
(請參閱列出可用擴展方法的鏈接)。 您甚至可以通過ToBitmap
擴展將其轉換為實際的Bitmap
,但在 Linux 上,這會將結果轉換為具有 24bpp RGB 像素格式的Bitmap
。
例子:
var image16 = BitmapDataFactory.CreateBitmapData(new Size(512, 512), PixelFormat.Format16bppGrayScale);
var row = image16.FirstRow;
do
{
for (int x = 0; x < image16.Width; x++)
{
// row[x] uses a Color32 structure (8 bit per color) but raw access
// enables you to use the full 16-bit color range:
row.WriteRaw<ushort>(x, 32768); // 50% gray
}
} while (row.MoveNextRow());
至於 8bpp indexed 和 24bpp RGB 格式,原生Bitmap
也支持 Linux,但請注意,從版本 .NET 開始,6 System.Drawing
默認僅支持 Windows 。 Microsoft 建議改用其他庫,但您仍然可以通過將"System.Drawing.EnableUnixSupport": true
添加到runtimeconfig.json
來啟用 Unix 支持。 或者,如果您決定使用我上面提到的我的庫,只需先調用DrawingModule.Initialize()
即可啟用Unix 支持,而無需編輯任何配置文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.