尽管我的回答来得太晚了,但我希望它对其他人有用。
鉴于到目前为止 OP 已经确定的 C# 的局限性,这里列出的标准仍然会给程序员在像素格式方面的有限自由。
- 一个灵活的位图句柄 C# 类,它支持多种像素格式,而不是 C# 泛型类
- 因为 C# 语言中的泛型类不会为图像处理用户带来任何好处。
- 一些安全保证 - 位图句柄对象的某些特征应该是不可变的
- 特别是,位图的像素格式和像素尺寸一旦创建就不允许改变。要更改这些,必须创建一个新对象。
- 提供可变接口(允许更改像素值)和不可变对象模型接口
- 在任何 API 函数上提供指示,表明不应尝试写入特定位图参数。
- 一组接受和返回位图句柄类的图像处理算法类。
- 在经济可行的范围内,每种算法都尽力处理不同种类的像素格式。
考虑到这些标准,我建议使用System.Windows.Media.Imaging作为您正在构建的库的基础。
命名空间是 Microsoft Windows 映像组件 (WIC)库的System.Windows.Media.Imaging
C# 对应项。因此,底层处理是在原生 C++ 中实现的,使其具有实际使用所需的速度。
由于在 WIC 中实现了广泛的像素格式支持,C# 对应版本也支持相同范围的像素格式。
WIC(和 System.Windows.Media.Imaging)不提供任何高级图像处理功能(没有 Canny 边缘检测、霍夫变换、对象检测等)
但是,就作为内存中位图对象交换接口(用于将不同的图像库与 C# 接口或绑定集成)而言,两者System.Windows.Media.Imaging.WriteableBitmap
都是System.Drawing.Bitmap
合适的。
在实现算法方面,有时很难使算法同样适用于单通道图像和多通道图像。这需要数年甚至数十年的多元数学研究。
因此,图像处理算法类通常专注于支持像素格式的窄子集:
- 1bpp Black White(用于逻辑/决策位图,例如边缘图或连接组件 blob 成员资格)
- 8bpp 灰色
- 24bpp BGR
- 32bpp BGRA
- 32bpp 灰色浮子
- 96bpp BGR 浮动
- 128bpp BGRA 浮动
如果算法类看到不是上述类型之一的输入位图句柄,它会尽力无损地将输入格式“提升”为上述格式之一。
考虑到这种自动上转换,该算法类的用户失去了对输出位图像素格式的严格控制,但获得了输出的视觉外观符合预期的保证。