Существует третий распространенный метод обработки отмены. То есть для хранения различий между двумя состояниями внутри объекта Undo. Вы можете сделать это как реальные различия (то есть, какие пиксели изменились и на что они изменились), но это, вероятно, почти такая же расточительная память, как и сохранение растрового изображения на каждом этапе.
В качестве альтернативы вы можете использовать шаблонный подход, но вместо повторного запуска команд при отмене вы сохраняете обратную команду - т.е. если пользователь увеличил значение красного на десять, то команда отмены должна уменьшиться это к десяти. Для отмены просто выполните обратную команду. Некоторые команды трудно найти обратные для, например, «преобразовать в черно-белое», но, смешав базовое растровое изображение с несколькими фильтрами, которые включаются или выключаются командой, вы, вероятно, можете сделать это.
В качестве еще одного предложения используйте упомянутый вами командный подход, но сохраните растровое изображение для предыдущего шага. Когда пользователь отменяет операцию, немедленно отобразите кэшированное растровое изображение из предыдущего (n-1) шага, а затем начните вычислять растровое изображение для n-2, чтобы вы были готовы к тому моменту, когда он снова нажимает отмену.