undo问题(100分)

  • 主题发起人 主题发起人 fuku
  • 开始时间 开始时间
F

fuku

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现类似windows画图程序中的undo操作?
 
Var
AUndoPicture:TPicture;
.....

Function BeforDraw(..)
begin
AUndoPicture.assign(image1.picture.assign);
end;
Function Undo(..)
begin
image1.picture.assign(AUndoPicture);
end;

或者你在Image上面放一个PaintBox先画到PaintBox上去,如果继续修改图像,就把刚刚的
那一笔画到Image上,如果Undo就不动Image直接PaintBox刷新,实现多级Undo可以管理一
个UndoPicture的列表。

 
猫哥:那岂不是要存n多Pic,万一图有很大怎么办?听说PhotoShop使用堆栈
来实现的,你能讲一下吗?
 
嘿嘿,我可不会那么高深的东东
 
堆栈也占内存,可考虑保存到临时文件。
 
呵,我也只会建立一个Undo链表,指定一个全局变量表示允许undo的次数,把许多的中间过程
的pic存在这个链表中,你想恢复多少步就可以返回多少步前的pic。
关于Windows中undo堆栈的故事,应该是标准控件如TEdit等有,而图形图像之流的东东好象
没听说过。
不要把undo这种东东想得太简单了,实际应用应该是很复杂的。如空间矢量图形编辑的undo,
你得定义许多Action,然后定义Action的参数,然后指定Action的作用对象,然后…天哪,
我到目前还没有完全实现。
不过如果你的堆栈技术能简单地解决我这些问题,我立际请你吃饭。
 
图像操作 Undo 的实现的确非常复杂,尤其多次 Undo 实现起来很难,wjiachun 说的是
单步 Undo ,而且是通过保存源位图来实现的,但是实际应用中这样的方式很难用于多步
Undo ,有的操作并不一定需要保存所有的位图信息,比如把图片亮度加大 10 点,由于
这样的操作是可逆的,所以只需要记下操作类型和范围,Undo 的时候把亮度减 10 点就
可以了。但问题是图像操作往往不是这么简单,而且操作也并不全是可逆的,PhotoShop
的 Undo 技术是在 5.0 之后才变成多步 Undo 的,可见难度相当大。
 
多人接受答案了。
 
后退
顶部