如何有效地实现图像的撤消历史记录

时间:2014-02-23 14:49:49

标签: image image-processing undo

我想为我正在编写的图像查看/编辑程序实现撤消/重做历史记录。

如果我们讨论撤消文本,那么保留当前文本并在历史记录中放置反向增量可能相当简单,类似于版本控制系统的工作方式。但是对于图像来说,它比那更有毛茸茸。

假设我的程序有两个操作:否定图像,并将其转换为灰度。否定图像是可逆的,而灰度转换则不是。这意味着您不能只保留最新图像并反转操作,因为并非所有图像都可以反转。有一个答案here可以解释这种情况。

另一种方法是在每次更改时将整个图像存储在内存中,但这可能很昂贵,尤其是对于较大的图像。我能想到的一个解决方案是将两种方法结合起来并保存整个图像以进行不可逆操作,但是否则只将操作存储在内存中。例如:

  1. 取消图像(撤消操作:否定图像)
  2. 顺时针旋转90度(撤消操作:逆时针旋转90度)
  3. 转换为灰度(撤消操作:在此操作之前从内存加载图像)
  4. 取消图像(撤消操作:否定图像)
  5. 有没有更好的方法来实现这个?此外,当操作变得众多时,将内存消耗保持在合理水平的合理方法是什么?

1 个答案:

答案 0 :(得分:2)

你说过:如果你应用的函数不可逆(一对一),那么你需要保留的信息不仅仅是使用的函数及其输入参数。不幸的是,这是一个数学事实,所以你无法绕过它。

  1. 反转 - 是一个双射,所以你只需要存储你将图像反转在堆栈上
  2. 灰度 - 是,但不是一对一,所以你需要存储额外的信息以及使用的功能。
  3. 您可以采取以下措施来节省记忆:

    1. 仅存储三种原始颜色。灰度公式为output=0.21 R + 0.71 G + 0.07 B。由于您将知道输出,因此您只需将红色和蓝色通道存储在内存中,并忽略绿色。这与YCbCr颜色空间类似。你将拥有灰度,只需要将Cb和Cr图像存储在内存中。

    2. 压缩。如果您以png格式或jpeg格式存储100%质量的图片,则无法对图片进行无损压缩。根据语言的不同,您应该能够在转换后写入内存中的字节数组。根据图像,这可以节省很多。

    3. 保存到临时磁盘空间。人们不希望他们的计算机因占用内存而崩溃,而且最近从磁盘加载图像很快。所有操作系统都提供应用级临时空间。只需确保从磁盘读取大缓冲区而不是一次读取一个字节,然后在处理之前将整个内容读入内存。这样可以超快速地从磁盘读取图像。