none
双缓冲GDI+绘图方法中如何清除缓冲区中指定区域的图像? RRS feed

  • 问题

  • 使用了双缓冲GDI+绘图方法,bufferImage是内存中的图像缓冲区。
    先把backGround.jpg图片作为背景绘制到内存缓冲区buffuerImage中;然后再向buffuerImage中的指定区域绘制图片A.png,输出到屏幕。最后,我想用另外一张图片B.png绘制到bufferImage中和A相同的区域,去替换A。这里要求的是替换A,就像从来没有向bufferImage中绘制过A一样。
    不能采用重新导入backGround.jpg,重新初始化bufferImage的办法,因为需要保留此时bufferImage的结果。

    我想到的最理想的办法是清除缓冲区中A所在区域的图像,不知道可以实现吗?如果可以怎么做?

    谢谢指点!

    2011年6月8日 10:36

答案

  • 双缓冲就是在内存中预先画好图片。。既然是那样,每一步都在内存中做一份副本就是。

     

    1. 画完 Ground.jpg, 做一份副本 Ground_copy.jpg

    2. 画完 A.png, 又做一份副本 A.png

    3. 要是想画 B.png 了,就拿 Ground_copy.jpg 出来,直接在上面画就是。

     

    至于最终显示,随便挑一个你想要的图片显示就是。


    学习学习....
    创建图像的副本吗?怎么弄呢?我试过,bitmap bak=bufferImage是不行的,因为bitmap是引用类型,保存不了。谢谢!

    嗯,不能直接赋值,要new一下。

    但是这样做仍然没能彻底解决问题:因为用B替换A的动作,在我的程序中有很多,而且屏幕上有很多的B1、B2。。。分别需要去替换A1、A2。。。,我不可能每次替换之前都保存一个BufferImage,太耗内存了。

    不知道有没有其它更好的办法?例如只需要保存所在的区域,因为相对于BufferImage来说,A、B的size都比较小。


    那样就仅保存操作队列吧。把操作过程记录下来。

     

    每次有改动的时候就画一幅新的图片出来。


    学习学习....
    • 已标记为答案 JSHZP 2011年7月6日 3:09
    2011年6月10日 7:24

全部回复

  • 当然,即使我能够清除指定的区域,也还要做到:在绘制A之前,先把缓冲区bufferImage中A所在区域的那块图像保存起来,例如赋给Bitmap类型的temp变量,等到要绘制B时,先绘制temp,这样这个区域就相当于没有绘制过A一样。

    问题是我还不知道怎样才能得到temp?

    2011年6月8日 10:46
  • 双缓冲就是在内存中预先画好图片。。既然是那样,每一步都在内存中做一份副本就是。

     

    1. 画完 Ground.jpg, 做一份副本 Ground_copy.jpg

    2. 画完 A.png, 又做一份副本 A.png

    3. 要是想画 B.png 了,就拿 Ground_copy.jpg 出来,直接在上面画就是。

     

    至于最终显示,随便挑一个你想要的图片显示就是。


    学习学习....
    2011年6月9日 2:57
  • 双缓冲就是在内存中预先画好图片。。既然是那样,每一步都在内存中做一份副本就是。

     

    1. 画完 Ground.jpg, 做一份副本 Ground_copy.jpg

    2. 画完 A.png, 又做一份副本 A.png

    3. 要是想画 B.png 了,就拿 Ground_copy.jpg 出来,直接在上面画就是。

     

    至于最终显示,随便挑一个你想要的图片显示就是。


    学习学习....
    创建图像的副本吗?怎么弄呢?我试过,bitmap bak=bufferImage是不行的,因为bitmap是引用类型,保存不了。谢谢!
    2011年6月9日 9:58
  • 双缓冲就是在内存中预先画好图片。。既然是那样,每一步都在内存中做一份副本就是。

     

    1. 画完 Ground.jpg, 做一份副本 Ground_copy.jpg

    2. 画完 A.png, 又做一份副本 A.png

    3. 要是想画 B.png 了,就拿 Ground_copy.jpg 出来,直接在上面画就是。

     

    至于最终显示,随便挑一个你想要的图片显示就是。


    学习学习....
    创建图像的副本吗?怎么弄呢?我试过,bitmap bak=bufferImage是不行的,因为bitmap是引用类型,保存不了。谢谢!

    嗯,不能直接赋值,要new一下。

    但是这样做仍然没能彻底解决问题:因为用B替换A的动作,在我的程序中有很多,而且屏幕上有很多的B1、B2。。。分别需要去替换A1、A2。。。,我不可能每次替换之前都保存一个BufferImage,太耗内存了。

    不知道有没有其它更好的办法?例如只需要保存A所在的区域,因为相对于BufferImage来说,A、B的size都比较小。

    2011年6月9日 10:10
  • dear

    看不出您如何設置DoubleBuffered屬性,你可參考以下處理看看,雙緩衝主要是交給顯示卡內存處理,可以讓控件在繪製時不會有閃爍的感覺

    http://www.dotblogs.com.tw/yc421206/archive/2010/10/20/18472.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年6月9日 15:50
  • 双缓冲就是在内存中预先画好图片。。既然是那样,每一步都在内存中做一份副本就是。

     

    1. 画完 Ground.jpg, 做一份副本 Ground_copy.jpg

    2. 画完 A.png, 又做一份副本 A.png

    3. 要是想画 B.png 了,就拿 Ground_copy.jpg 出来,直接在上面画就是。

     

    至于最终显示,随便挑一个你想要的图片显示就是。


    学习学习....
    创建图像的副本吗?怎么弄呢?我试过,bitmap bak=bufferImage是不行的,因为bitmap是引用类型,保存不了。谢谢!

    嗯,不能直接赋值,要new一下。

    但是这样做仍然没能彻底解决问题:因为用B替换A的动作,在我的程序中有很多,而且屏幕上有很多的B1、B2。。。分别需要去替换A1、A2。。。,我不可能每次替换之前都保存一个BufferImage,太耗内存了。

    不知道有没有其它更好的办法?例如只需要保存所在的区域,因为相对于BufferImage来说,A、B的size都比较小。


    那样就仅保存操作队列吧。把操作过程记录下来。

     

    每次有改动的时候就画一幅新的图片出来。


    学习学习....
    • 已标记为答案 JSHZP 2011年7月6日 3:09
    2011年6月10日 7:24