zoukankan      html  css  js  c++  java
  • C# Bitmap deep copy

    今天在研究一个关于 Bitmap deep copy 的问题, 经过一系列的查询,在StackOverFlow上面找到了答案,遂记录下来:

      public static Bitmap DeepCopyBitmap(Bitmap bitmap)
            {
                try
                {
                    Bitmap dstBitmap = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), bitmap.PixelFormat);
                    return dstBitmap;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error : {0}", ex.Message);
                    return null;
                }
            }

    解析:

    new Bitmap(Image img) 方法会改变图片色彩格式 (BitMap.PixelFormat)。

    bitmap.Clone() 方法会生成一个shadow copy。

    当使用 bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), bitmap.PixelFormat) 类似于做BitMap.LockBits操作,会生成一个新的内存。

    参考:

    http://stackoverflow.com/questions/5882815/how-to-create-a-bitmap-deep-copy

    http://stackoverflow.com/questions/12709360/whats-the-difference-between-bitmap-clone-and-new-bitmapbitmap/13935966#13935966

    补充:由于我是用的是Framework2.0, 所以上述deep copy 未成功!!!,自己重新实现了一下

    public static Bitmap DeepCopyBitmap(Bitmap bitmap)

    {
                try
                {               

                    Bitmap dstBitmap = null;                
                    using (MemoryStream ms = new MemoryStream())
                    {
                        BinaryFormatter bf = new BinaryFormatter();
                        bf.Serialize(ms, bitmap);
                        ms.Seek(0, SeekOrigin.Begin);
                        dstBitmap = (Bitmap)bf.Deserialize(ms);
                        ms.Close();
                    }                
                    return dstBitmap;
                }
                catch (Exception ex)
                {
                    errMsg = ex.Message;
                    return null;
                }

    }

  • 相关阅读:
    单例模式
    C++中迭代器原理、失效和简单实现
    C++中静态成员变量要在类外部再定义或初始化的原因
    idea maven javaweb项目迁移时的maven和版本报错问题解决(可解决同类错误)
    java 继承类之后,访问不到超类的属性的原因及解决方法
    spring boot admin
    javaweb 报表生成(pdf excel)所需要用到的技术和思路
    团队合作开发git冲突解决方案 Intellij IDEA
    【项目管理】 使用IntelliJ IDEA 将项目发布(提交)到GitLab
    IDEA/Git 设置多个push远程仓库或者同时提交多个push仓库
  • 原文地址:https://www.cnblogs.com/atuotuo/p/6125430.html
Copyright © 2011-2022 走看看