Men*_*nno 7 photoshop drawing undo
这个问题可能适用于一般的绘图系统.我想知道如何在PS中实现撤消功能.程序是否在每次操作之前拍摄画布的快照?如果是这样,这不会导致巨大的内存需求吗?我查看了Command模式,但我不太清楚它是如何应用于绘图的.
此致,门诺
小智 0
我发现解决这个问题的最简单方法是使用持久数据结构,尽管我不知道 Adobe 如何解决它,如下所示:
您可以将图像视为图像图块的集合,例如每个图像图块为 64x64 像素,并且它们会被垃圾收集或引用计数(例如:shared_ptr在 C++ 中使用)。
现在,当用户对图像图块进行更改时,您可以创建一个新版本,同时浅复制未修改的图块:
在这样的更改后,除了那些深色瓷砖之外的所有内容都会被浅复制。当你这样做时,你的整个撤消系统可以归结为:
before user operation:
store current image in undo stack
on undo/redo:
swap image at top of undo stack with current image
Run Code Online (Sandbox Code Playgroud)
它变得超级简单,不需要在每个撤消条目中一遍又一遍地存储整个图像。作为一个额外的好处,当用户复制和粘贴图层时,它几乎不需要更多的内存,除非/直到他们对粘贴的图层进行更改。它基本上为您提供了一个图像实例化系统。另一个好处是,当用户创建一个透明图层(例如 2000x2000 像素)但他们只绘制图像的一小部分(例如仅 100x100 像素)时,这也几乎不需要任何内存,因为空/透明图块不会占用任何内存。必须存储任何像素,只有几个空指针。它还可以加快与此类大部分透明图层的合成速度,因为您不必对空图像图块进行 Alpha 混合,只需跳过它们即可。在这些情况下,它还可以加快图像过滤器的速度,因为它们同样可以跳过空的图块。
至于 PS 动作,这是一种不同的方法。在那里,您可以使用一些脚本来指示要执行的操作,但您可以将其与上面的脚本结合起来,以有效地仅缓存图像的修改部分。这种方法的重点是避免一遍又一遍地深度复制整个图像,并增加内存使用量来缓存图像的先前状态以进行撤消,而不必为各种情况编写单独的撤消/重做逻辑。可能发生的不同操作。
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |