以下为类的方法概览,方法摘要里标注[OK]的是效率已经超过调用OpenCV(使用Emgu 2.3版本)的,未标注的速度慢于OpenCV,标注[??]的尚未进行测试。
代码下载地址:http://download.csdn.net/detail/wmesci/3868534
namespace wmesci.Images { /// <summary>像素格式</summary> public enum PixelFormat { GRAY, BGR, RGB } /// <summary>非托管图像类</summary> public unsafe class UnmanagedImage : IDisposable { public UnmanagedImage(int width, int height, PixelFormat pf) public UnmanagedImage(int width, int height, PixelFormat pf, byte* data) public UnmanagedImage(Bitmap bmp) public UnmanagedImage(string filename) /// <summary>将图像数据复制到指定的位置</summary> public void CopyTo(void* dst) /// <summary>使用指定的数据源填充图像</summary> public void SetValue(byte* src) /// <summary>将当前图像填充为参数所表示的颜色,参数数组大小必须和像素大小一致</summary> public void SetValue(params byte[] value) /// <summary>图像像素宽度</summary> public readonly int Width; /// <summary>图像像素高度</summary> public readonly int Height; /// <summary>图像所占内存大小</summary> public readonly int Length; /// <summary>扫描跨度(每行字节数,4字节向上对齐)</summary> public readonly int Stride; /// <summary>图像像素格式</summary> public readonly PixelFormat PixelFormat; /// <summary>每个像素所占字节数</summary> public readonly int PixelSize; /// <summary>图像数据地址</summary> public byte* Pointer { get; private set; } /// <summary>返回当前图像的一份副本</summary> public UnmanagedImage Clone() /// <summary>转换为Bitmap</summary> public Bitmap ToBitmap() /// <summary>转换为Bitmap</summary> public Bitmap Bitmap { get; } /// <summary>[??]转换像素格式</summary> public static void Convert(UnmanagedImage img, UnmanagedImage dst) /// <summary>[OK]非运算:dst = ~img</summary> public static void Not(UnmanagedImage img, UnmanagedImage dst) /// <summary>[OK]与运算:dst = img1 & img2</summary> public static void And(UnmanagedImage img1, UnmanagedImage img2, UnmanagedImage dst) /// <summary>[OK]与运算:dst = img1 & value</summary> public static void And(UnmanagedImage img, byte[] value, UnmanagedImage dst) /// <summary>[OK]或运算:dst = img1 | img2</summary> public static void Or(UnmanagedImage img1, UnmanagedImage img2, UnmanagedImage dst) /// <summary>[OK]或运算:dst = img1 | value</summary> public static void Or(UnmanagedImage img, byte[] value, UnmanagedImage dst) /// <summary>[OK]异 或:dst = img1 ^ img2</summary> public static void Xor(UnmanagedImage img1, UnmanagedImage img2, UnmanagedImage dst) /// <summary>[OK]相 加:dst = img1 + img2</summary> public static void Add(UnmanagedImage img1, UnmanagedImage img2, UnmanagedImage dst) /// <summary>[OK]相 加:dst = img1 + value</summary> public static void Add(UnmanagedImage img1, byte[] value, UnmanagedImage dst) /// <summary>[OK]相 减:dst = img1 - img2</summary> public static void Sub(UnmanagedImage img1, UnmanagedImage img2, UnmanagedImage dst) /// <summary>[OK]相 减:dst = img1 - value</summary> public static void Sub(UnmanagedImage img1, byte[] value, UnmanagedImage dst) /// <summary>[OK]乘 积:dst = img1 * img2</summary> public static void Mul(UnmanagedImage img1, UnmanagedImage img2, double scale, UnmanagedImage dst) /// <summary>[OK]乘 积:dst = img1 * scale</summary> public static void Mul(UnmanagedImage img1, double scale, UnmanagedImage dst) /// <summary>[ ]阈值化:dst = img < threshold ? Min : Max</summary> public static void Threshold(UnmanagedImage img, byte threshold, UnmanagedImage dst) /// <summary>[OK]加权和:dst = a * img1 + b * img2</summary> public static void AddWeighted(UnmanagedImage img1, double a, UnmanagedImage img2, double b, UnmanagedImage dst) /// <summary>[ ]均值滤波:dst = 其周围半径n范围内的像素值的平均数</summary> public static void Smooth(UnmanagedImage img, UnmanagedImage dst, int w, int h) /// <summary>[??]翻转源图像</summary> public static void Flip(UnmanagedImage img, UnmanagedImage dst, bool flipx, bool flipy) /// <summary>[??]调整图像大小,使用双线性插值</summary> public static void Resize(UnmanagedImage img, UnmanagedImage dst) /// <summary>释放资源</summary> public void Dispose() } }
2011.11.28更新:
1、添加And、Or、Not、Xor4个方法。
2011.11.29更新:
1、增加对彩色图像的支持。
2011.12.1更新:
1、为And、Or、Add、Sub、Mul添加一个和常量进行运算的重载。
2、添加两个方法:Flip、Resize。
3、Convert方法改为静态方法,以避免在不需要的时候重复创建对象。
4、ToBitmap方法现在只会创建一个Bitmap对象,以后再调用时会将图像数据复制到这个Bitmap里然后直接返回,避免重复创建对象,提高效率。
注:没有考虑多线程使用的情况下的线程同步问题,如有需要请自己做。