簡體   English   中英

保存 16 位灰度圖像的結構

[英]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 我可以重新使用來保存像素格式類型的圖像:

  • PixelFormat.Format8bppIndexed:
  • PixelFormat.Format16bppGrayScale:
  • PixelFormat.Format24bppRgb:

我知道 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM