Система отмены фотошопа - PullRequest
       42

Система отмены фотошопа

7 голосов
/ 04 апреля 2009

Вопрос, вероятно, относится к системам рисования в целом. Мне было интересно, как функциональность отмены реализована в PS. Делает ли программа снимки холста перед каждой операцией? Если это так, не приведет ли это к огромным требованиям к памяти? Я изучил шаблон Command, но не могу понять, как это будет применяться к рисованию.

С уважением, Менно

Ответы [ 5 ]

12 голосов
/ 04 апреля 2009

Это называется шаблон команды . Его легко реализовать, поскольку он полезен для любого редактора.

Photoshop применяет сложенные преобразования к исходному изображению. Одна команда одна команда. Он просто отменяет преобразование при отмене. Так что он просто сохраняет оригинальные и последние версии, но я думаю, что он может кэшировать последние несколько версий только для производительности.

4 голосов
/ 04 апреля 2009

Я не уверен, как Adobe Photoshop реализует undo, но узел Paint в Apple Shake приложении для составления довольно легко объяснить:

  • Каждый сток хранится в виде серии точек вместе с некоторой информацией, такой как цвет обводки, размер кисти и т. Д.
  • Когда вы рисуете сток, изменения вносятся в текущее изображение.
  • Каждые x штрихи (10 я думаю) текущее изображение кэшируется в памяти.
  • Когда вы отменяете, он перерисовывает последние ~ 9 разрядов на предыдущем кэшированном изображении.

Есть две проблемы с этим:

  • Когда вы отменяете более 10 раз, он должен пересчитать все изображение. При тысячах ударов это может вызвать паузу в несколько секунд.
  • С помощью Shake вы сохраняете установочный файл, содержащий информацию об обводке, а не фактические значения пикселей. Тогда это означает, что вам придется пересчитывать все изображение всякий раз, когда вы снова открываете узел Paint, или визуализируете изображение (однако это не такая большая проблема, как отмена операции).

Ну, есть и третья проблема: Shake ужасно глючит и плохо реализован во многих областях, а узел Paint - один из них, поэтому я не уверен, насколько это хорошая реализация, но я не могу представьте, что Photoshop слишком отличается (хотя далеко лучше оптимизирован).

4 голосов
/ 04 апреля 2009

Так как некоторые операции будут необратимыми, и, как вы говорите, снимок всего изображения каждый раз будет исключен, то единственной альтернативой, которую я вижу, будет стек дельт. Дельта - это набор масок, содержащих измененные пиксели до операции. Конечно, многие операции могут быть обратимыми, поэтому их дельты могут быть оптимизированы.

0 голосов
/ 05 января 2018

Самый простой способ, который я нашел для решения этой проблемы, хотя я не знаю, как Adobe справляется с этим, - это использовать постоянную структуру данных, например:

enter image description here

Вы рассматриваете изображение как набор плиток изображения, скажем, 64x64 пикселя каждый, и они получают сборщик мусора или подсчитывают ссылки (например: shared_ptr в C ++).

Теперь, когда пользователь вносит изменения в плитку с изображением, вы создаете новую версию при мелком копировании неизмененных плиток:

enter image description here

Все, кроме этих темных плиток, копируется при таком изменении. И когда вы делаете это таким образом, вся ваша система отмены сводится к следующему:

before user operation:
    store current image in undo stack
on undo/redo:
    swap image at top of undo stack with current image

И это становится очень просто, не требуя многократного сохранения всего изображения в каждой записи отмены. В качестве бонуса, когда пользователи копируют и вставляют слои, это едва ли занимает больше памяти, если / пока они не внесут изменения в этот вставленный слой. Это в основном предоставляет вам систему экземпляров для изображений. В качестве еще одного бонуса, когда пользователь создает прозрачный слой, скажем, 2000x2000 пикселей, но он рисует лишь небольшую часть изображения, как, скажем, просто 100x100 пикселей, который также едва занимает какую-либо память, потому что пустые / прозрачные плитки не должны хранить любые пиксели, только пару нулевых указателей. Это также ускоряет компоновку с такими прозрачными слоями, потому что вам не нужно альфа-смешивать пустые фрагменты изображения и просто пропустить их. В этих случаях он также ускоряет фильтры изображений, поскольку они также могут просто пропускать пустые плитки.

Что касается действий PS, это немного другой подход. Там вы можете использовать некоторые сценарии, чтобы указать, какие действия нужно выполнить, но вы можете связать их с приведенным выше, чтобы эффективно кэшировать только измененные части изображения. Смысл этого подхода состоит в том, чтобы избежать необходимости глубокого копирования всего изображения снова и снова и увеличивать использование памяти для кэширования предыдущих состояний изображения для отмены без необходимости возиться с записью отдельной логики отмены / повторения для всех видов различные операции, которые могут произойти.

0 голосов
/ 04 апреля 2009

Photoshop использует History для отслеживания своих действий. Они также служат отменой, поскольку вы можете вернуться в историю в любой момент. Вы можете установить размер истории в настройках.

Я также предлагаю вам взглянуть на Adobe Version Cue как инструмент для отмены ретроспективы или версий , он встроен в пакет для этой единственной цели. http://en.wikipedia.org/wiki/Adobe_Version_Cue

...