我有1个大的bitmap,我想复制他,以为要频繁的复制使用他,所以就要考虑效率的问题!!!
有没有什么好的方法么
1》DrawImage方法不行!
//Bitmap tempbitmap = new Bitmap(insertrect.Width, insertrect.Height);以为要new出一块来存放我复制下来的bitmap。所以效率不理想2》Clone 方法比上一个稍微好点。但是效果也不理想。大家还有什么好的建议么?????

解决方案 »

  1.   

    这种问题需要考虑你的算法的本质。
    你真的需要复制整块 Bitmap吗?
    在Clone函数中可以只复制一个bitmap的一部分,为什么不尝试着优化你的算法,只复制bitmap的部分并修改这一部分来解决这个问题呢?
    如果你要使用GDI进行这种类型的绘制,的确是会比较慢。这一点没办法解决。
      

  2.   

    Bitmap (Image)  从指定的现有图像初始化 Bitmap 类的新实例。  看看这样行不行?它可以创建新实例
      

  3.   

    我就是用Clone()复制了其中的一块。现在的问题是我的bitmap大小是1000*800
    而我clone的大小大约是900*700。剩余的部分我要重画!!为就是为了考虑效率才想复制很大一块不需要重新画的呢。要是全重画效率还蜗牛呢!!!!现在的问题是这快不要重画的部分如何的处理我是用的双缓冲的绘制。
      

  4.   

    鼠标每次移动。我都要处理的啊。只是每次都重新绘制小的部分。复制大的部分!!!!
    现在的问题是如何最有效率的复制大的部分。
    gdi+中有什么好方法?
    或是gdi中。还有问一下。gdi中bltbit效率如何!!! 
      

  5.   

    看你的需求知不是是要把Bitmap绘制一下而已,而不需要再内存中重建一个新的Bitmap呀。
    绘图函数中可以绘制整个Bitmap,也可以只绘制一部分。
      

  6.   

    PS:为什么DrawImage不行,如果DrawImage不行,那么bltbit就可以了?两者做的事情本质是一样的。
    就效率而言,个人经验,bltbit好些。貌似DrawImage即便是绘制图片的一部分和整幅图也没啥区别,不过即便如此的话,也要比创建一个新的Bitmap要好些呀。
      

  7.   

    楼上的大哥。“貌似DrawImage即便是绘制图片的一部分和整幅图也没啥区别,不过即便如此的话,也要比创建一个新的Bitmap要好些呀。“我明白你的意思。但是我要把绘制图片的一部分放在内存中。你说是不是要建立一个先的bitmap!!!
    在说了,利用双缓冲绘制图形,首先不是的要建立一个内存的bitmap么。然后把内存的bitmap显示到绘制表面上。
    我现在的问题是第1次在内存的bitmap上绘制以后,由于某些操作,我需要把原来内存上一部分保留。另一部分进行重新绘制,但是保留的部分并不是原来的位置(可能向左移动,也可能向右移动!),我需要移动他的位置以适应新的。然后把剩余的内存bitmap进行从新绘制,然后在显示到绘制表面上!!这个过程中。在保留原来内存bitmap的时候是不是需要建立个新的bitmap,然后在把这个bitmap绘制到原来内存bitmap上呀!!!这就需要建立个新的bitmap对象!!这样一样效率貌似就蜗牛了。有没有好的好的方法实现我说的呢,并且不用建立一个新的bitmap!!!!
      

  8.   

    看起来就是做一个图片的漫游呀,我觉得问题在于是不是每次都需要创建一个临时的Bitmap。我觉得这类应用通常是这样的,完整地图(总背景)是一个Bitmap,然后创建一个和输出视口一样大的Bitmap作为缓存,每次显示位置变化时,把背景绘制到缓存的Bitmap上(这是不需要创建新的Bitmap的),然后再在缓存的Bitmap上绘制其它内容,最后输出到窗口DC上就可以了。
    如果觉得GDI+慢,就用GDI吧。如果不知道怎么把一个Bitmap绘制到另一个Bitmap上的话,看下面的代码:Graphics g = Graphics.FromImage(bmpBuf);
    g.DrawImage(...);GDI的话就是创建一个兼容DC,过程和GDI+类似。