虽然我的答案来得非常晚,我希望它会对其他人有用。
考虑到目前为止OP已经识别的C#的局限性,下面是一些标准列表,它们仍然会给像素格式方面的程序员提供有限的自由度。
- 柔性位图处理的C#类,它支持多种像素格式,无需为C#通用类
- 因为在C#语言的通用类就不会得到任何益处图像处理的用户。
- 一些安全保障 - 一个位图处理对象的某些特性应该是一成不变的
- 尤其是位图的像素格式,像素尺寸不应该被允许更改一次创建。要改变这些,必须创建一个新的对象。
- 同时提供可变的接口(允许改变到的像素值)的和不可改变的对象模型接口
- 提供关于任何API函数的指示应该没有试图写入一个特定的位图的参数。
- 一组接受并返回位图句柄类的图像处理算法类。
- 每种算法都尽最大努力处理不同类型的像素格式,只要经济可行。
考虑到的标准,我会建议使用System.Windows.Media.Imaging,当你建造的库底。
命名空间System.Windows.Media.Imaging
是Microsoft Windows Imaging Component (WIC)库的C#对等项。因此,底层处理是在本地C++中实现的,从而为实际使用提供了所需的速度。
由于在WIC中实现了广泛的像素格式支持,C#对象也支持相同的range of pixel formats。
的WIC(和System.Windows.Media.Imaging)不提供任何先进的图像处理能力(这样的事Canny边缘检测的,Hough变换,对象检测等)
但是,就内存位图对象交换接口(用于将不同的图像库与C#接口或绑定集成)而言,System.Windows.Media.Imaging.WriteableBitmap
和System.Drawing.Bitmap
都适用。
在实现算法方面,有时很难让算法同样适用于单通道图像和多通道图像。这需要多年,如果不是数十年的多元数学研究。
因此,常见的是,图像处理算法的类来重点支持的像素格式的窄子集:
- 1bpp映射黑白(逻辑/判定的位图,例如,边缘地图或连接部件的blob成员)
- 8bpp的灰色
- 24 bpp的BGR
- 32bpp的BGRA
- 32bpp的灰色浮法
- 96bp p BGR浮动
- 128bpp BGRA浮法
如果算法类看到的输入位图处理的不是上述类型之一,它将尽力无损地“提升”的输入格式转换的一个以上格式。
有了这个自动升频转换,这种算法类的用户失去了对输出位图的像素格式严格控制,但涨幅在保证输出的外观将按照预期。
我不确定你的意思,但我们必须在我们的项目中处理很多不同的图像格式,而我们只是通过使用托管扩展性框架来处理。 – TimothyP 2009-11-26 10:07:02
MEF很酷,但我不确定它解决了我所说的问题。你可以看看GIL吗? http://www.boost.org/doc/libs/1_39_0/libs/gil/doc/index.html。它实际上可以让你编写一种算法来写入任何图像格式。图像是一个迭代器,可以枚举每个像素,而不管通道数量或位深度,甚至通道是按照交错还是平面顺序排列。这个和更多的是在GIL中完成的,但是由于模板的原因,它们的手动编码速度非常接近。 – Charles 2009-11-26 18:46:46
我想更清楚:说我有一个算法来计算直方图。我不想为灰度,565RGB,24RGB,32RGB,RGBA,ARGB,BGRA,ABGR或甚至其他色彩空间(如CYMK和HSL)编写单独的灰度。通过软件的魔力,这些差异应该能够被抽象出来,因此图像处理例程的算法编写者只需要编写一种可以在所有格式上运行的算法。 – Charles 2009-11-26 18:51:59