【发布时间】:2021-11-25 13:48:11
【问题描述】:
我需要从内存缓冲区中屏蔽图像(用黑色填充的矩形区域)。所以我天真地将Bitmap 类与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# 中是否有任何现有的类可以重复使用来保存pixelformat 类型的图像:
- PixelFormat.Format8bppIndexed:
- PixelFormat.Format16bppGrayScale:
- PixelFormat.Format24bppRgb:
我知道 GDI+ does not support saving/displaying 16 位图像,我只需要一个具有图像样式访问的内存结构。
仅供参考,我尝试了以下技巧:
var image = new Bitmap(512,512,PixelFormat.Format24bppRgb);
image.Flags = ImageFlags.ColorSpaceGray;
但是Flags 是只读的。
【问题讨论】: