接上一篇内容,首先是对像素处理的优化,我们知道Bitmap中提供了GetPixel和SetPixel方法可以访问Bitmap类中的某个位图像素数据,但是效率相当低下。用过OpenCV或者EmguCV的人知道它们使用的是自己的数据结构cvImage。不是每个人都有OpenCV的环境,其实微软中的GDI+(BitmapData)也提供了可以用于高速访问内存中Bitmap的单个位图数据的方法。在C#下,有两种可选的方式使用BitmapData类型:Marshal类和指针。
Marshal
Marshal支持从托管内存空间复制数据到非托管内存空间,或是反之。起到托管和非托管编程模型之间的桥梁作用。
指针
C#中保留了指针和指针运算,但是必须在不安全代码中使用。默认下不支持,需要程序员自己通过unsafe来定义不安全上下文。虽然是不安全代码但是并不意味着是不安全的,不安全代码省略了托管内存与非托管内存交换过程,性能更优。但是操作不慎会引起内存泄露,因此使用务必小心。