• [2011年12月1日] UnmangedImage类


    以下为类的方法概览,方法摘要里标注[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里然后直接返回,避免重复创建对象,提高效率。


    注:没有考虑多线程使用的情况下的线程同步问题,如有需要请自己做。

  • 相关阅读:
    synchronized 到底该不该用?
    线上Java程序占用 CPU 过高,请说一下排查方法?
    『JVM』我不想知道我是怎么来滴,我就想知道我是怎么没滴
    Golang 实现 Redis(8): TCC分布式事务
    Golang 实现 Redis(7): 集群与一致性 Hash
    Golang 实现 Redis(6): 实现 pipeline 模式的 redis 客户端
    LSM 树详解
    uni-app subNVue 原生子窗体简单使用案例(app端)
    日计不足涓滴成河-自定义响应结果格式化器
    RTT之软件包
  • 原文地址:https://www.cnblogs.com/wmesci/p/2736003.html
Copyright © 2020-2023  润新知