请教:用CDib类来实现撤销、重复操作

dinghl 2009-06-02 09:41:52
我用了《精通Visual CNET图像处理编程》的CDib类来实现画图的功能,想增加撤销、重复操作,采用《类似画笔的绘图控件》里的方法,用DIBToBitmap函数保存每次操作的位图到堆栈,撤销、重复时采用BitmapToDIB函数。撤销、重复可以实现。问题是当读入小的图像时,操作到n步后(n由图像大小决定,图像越大,n就越小)用DIBToBitmap函数转换出的位图为空。如果读入大的图像,直接就转换为空了。同一幅小图像,如果程序刚开始运行,可以进行撤销、重复操作。但如果之前对其他的图像有操作,再来处理这幅图像时也会出错。我感觉是内存的问题?但好几天了,一直没有找到问题的原因和解决方法。马上就要检查了,比较着急,请大家帮忙!
...全文
90 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinghl 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangxd09 的回复:]
都保存为对象 然后进行管理 我的资源里有个小例子 用撤销、重复的类来操作
[/Quote]
请问你说的小例子在哪儿看啊
dinghl 2009-06-07
  • 打赏
  • 举报
回复
请问你说的小例子在哪儿看啊
99 2009-06-04
  • 打赏
  • 举报
回复
应该是内存问题吧.堆上的内存分配完了,你的栈就没法push了,然后后面的步骤都是用新的dib,这个dib内存分配失败,所以以后的操作都over了
kwovex 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangxd09 的回复:]
都保存为对象 然后进行管理 我的资源里有个小例子 用撤销、重复的类来操作
[/Quote]

有没有写成模板类的
lambochan 2009-06-03
  • 打赏
  • 举报
回复
如果一张图50M,push 10张就500M..再push多几张估计不是那么多机器能承受的.
如果是那样,建议考虑一下保存操作而不是保存整幅DIB,否则再好的机器都死..
lambochan 2009-06-03
  • 打赏
  • 举报
回复
有没鉴定步数?是否无休止地push了?通常是过了5步就把栈底的del掉,然后继续push.

否则,除非是巨图.没可能这么快就耗尽的哦.
dinghl 2009-06-03
  • 打赏
  • 举报
回复
我现在是5步,但是如果操作很多的话,图像就保存不下来了,只有前面n-4到n步的图像能正确记录下来,对大图像根本就没法操作,这是为什么呢?
liangxd09 2009-06-03
  • 打赏
  • 举报
回复
都保存为对象 然后进行管理 我的资源里有个小例子 用撤销、重复的类来操作
aaaa3105563 2009-06-03
  • 打赏
  • 举报
回复
帮顶·
ilei3344 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lambochan 的回复:]
如果一张图50M,push 10张就500M..再push多几张估计不是那么多机器能承受的.
如果是那样,建议考虑一下保存操作而不是保存整幅DIB,否则再好的机器都死..
[/Quote]
对,建议保存操作,或者保存每步绘制的东西而不是整体保存。
有现成的参考,photoshop
lambochan 2009-06-02
  • 打赏
  • 举报
回复
限定步数...
象windows的画图,好象只有3步undo.

无休止肯定资源耗尽.

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧