Files
ds-galo/openspec/changes/archive/2026-10-24-photo-effects-editing/specs/photos/spec.md
T
iu cb9433666a chore(openspec): архивировать photo-effects-editing и обновить photos
Изменение применено к основной спеке photos: эффекты, виньетка, зерно,
живой предпросмотр, свёрнутые секции панели и редактирование из просмотрщика.
Change перемещён в archive.
2026-10-24 22:58:07 +03:00

16 KiB

Spec Delta

MODIFIED Requirements

Requirement: Неразрушающее редактирование фотографии

Система SHALL поддерживать неразрушающее редактирование фотографий. Параметры правок (свет, цвет и эффекты) SHALL храниться в метаданных фото, а отредактированная версия SHALL создаваться как отдельные объекты (роли edit, edit_thumb, edit_medium, edit_preview) рядом с исходными вариантами. Рендер SHALL выполняться по исходному объекту фото, а не по его уменьшенным вариантам. Исходный объект SHALL оставаться неизменным, а скачивание SHALL отдавать оригинал. Сброс правок SHALL удалять и параметры, и отредактированную версию. Правки SHALL применяться только к изображениям.

Scenario: Сохранение правок

  • WHEN пользователь сохраняет правки фото (свет, цвет и/или эффекты)
  • THEN параметры сохраняются в метаданных, отредактированная версия рендерится в фоне, а после рендера фото получает URL отредактированных вариантов

Scenario: Фоновая подготовка версий

  • WHEN правки фото сохранены
  • THEN система готовит варианты сетки и полноразмерную версию в фоне и сообщает о готовности

Scenario: Рендер по оригиналу

  • WHEN готовится отредактированная версия фото
  • THEN световые и цветовые правки, а также эффекты применяются к пикселям исходного объекта, а не к его уменьшенной копии

Scenario: Неразрушачность

  • WHEN фото отредактировано
  • THEN исходный объект и его варианты остаются неизменными

Scenario: Сброс правок

  • WHEN пользователь сбрасывает правки
  • THEN параметры и отредактированная версия удаляются, а фото снова показывается в исходном виде

Scenario: Права на правки

  • WHEN правки сохраняет пользователь без прав на это фото
  • THEN система отклоняет запрос

Scenario: Редактирование видео

  • WHEN пользователь пытается отредактировать видео
  • THEN система отклоняет запрос

Scenario: Цветовые правки сохраняются и рендерятся

  • WHEN пользователь сохраняет цветовые правки фото: баланс белого (температура/оттенок), сочность (vibrance), насыщенность, цветовой микшер по оттенкам, цветокоррекцию (тени/средние тона/света, яркость зон, наложение, баланс) или поканальную коррекцию
  • THEN параметры цвета сохраняются в метаданных, отредактированная версия рендерится в фоне, а после рендера фото получает URL отредактированных вариантов

Scenario: Цветовые правки применяются к пикселям исходного объекта

  • WHEN готовится отредактированная версия фото с цветовыми правками
  • THEN цветовые правки применяются к пикселям исходного объекта после световых правок, а не к его уменьшенной копии

Scenario: Пустые цветовые правки не сохраняются

  • WHEN в цветовых параметрах заданы только наложение/баланс или оттенок колеса без силы и яркости
  • THEN правки считаются пустыми и фото не получает цветовую версию

Scenario: Пустые правки эффектов не сохраняются

  • WHEN во всех эффектах заданы только значения по умолчанию (сила эффекта, виньетки и зерна равна нулю)
  • THEN правки считаются пустыми и фото не получает новую отредактированную версию

ADDED Requirements

Requirement: Текстура

Клиент SHALL позволять настраивать текстуру фото в диапазоне -100..100. Положительные значения SHALL усиливать контраст мелких деталей, отрицательные — ослаблять его. Эффект SHALL применяться к исходному кадру после световых и цветовых правок.

Scenario: Усиление текстуры

  • WHEN пользователь увеличивает значение текстуры
  • THEN мелкие детали становятся контрастнее, а общая тональность кадра не меняется

Scenario: Ослабление текстуры

  • WHEN пользователь уменьшает значение текстуры ниже нуля
  • THEN мелкие детали сглаживаются

Scenario: Текстура в пределах допустимого

  • WHEN клиент присылает значение текстуры вне диапазона -100..100
  • THEN сервер ограничивает его ближайшей границей диапазона

Requirement: Чёткость

Клиент SHALL позволять настраивать чёткость фото в диапазоне -100..100. Положительные значения SHALL усиливать локальный контраст средних частот, отрицательные — смягчать его. Чёткость SHALL NOT создавать заметных ореолов на границах контрастных объектов. Эффект SHALL применяться после световых и цветовых правок.

Scenario: Усиление чёткости

  • WHEN пользователь увеличивает значение чёткости
  • THEN локальный контраст средних тонов растёт, а границы контрастных объектов остаются без заметных ореолов

Scenario: Ослабление чёткости

  • WHEN пользователь уменьшает значение чёткости ниже нуля
  • THEN изображение становится мягче

Requirement: Убрать дымку

Клиент SHALL позволять ослаблять или усиливать дымку в диапазоне -100..100. При положительных значениях сервер SHALL оценивать дымку по кадру и возвращать контраст и насыщенность удалённых участков; отрицательные значения SHALL добавлять дымку.

Scenario: Удаление дымки

  • WHEN пользователь увеличивает значение «Убрать дымку» на кадре с дымкой
  • THEN дальние планы становятся контрастнее и насыщеннее

Scenario: Добавление дымки

  • WHEN пользователь уменьшает значение «Убрать дымку» ниже нуля
  • THEN кадр становится менее контрастным, как при дымке

Requirement: Виньетка

Клиент SHALL позволять настраивать виньетку: силу -100..100, среднюю точку и растушёвку 0..100 (по умолчанию 50), округлость -100..100, света 0..100, а также режим «Свет», «Цвет» или «Закарасить». Режим «Свет» SHALL затемнять или осветлять края, «Цвет» — тонировать их выбранным цветом с сохранением светлоты, «Закарасить» — заливать их выбранным цветом.

Scenario: Затемнение краёв

  • WHEN пользователь задаёт положительную силу виньетки в режиме «Свет»
  • THEN края кадра затемняются, а центр остаётся без изменений

Scenario: Осветление краёв

  • WHEN пользователь задаёт отрицательную силу виньетки в режиме «Свет»
  • THEN края кадра осветляются

Scenario: Цветная виньетка

  • WHEN пользователь выбирает режим «Цвет» или «Закарасить» и задаёт цвет виньетки
  • THEN края кадра тонируются или заливаются этим цветом с силой, заданной ползунком виньетки

Scenario: Геометрия виньетки

  • WHEN пользователь меняет среднюю точку, растушёвку или округлость
  • THEN меняются размер, мягкость и форма зоны виньетки

Scenario: Защита светов

  • WHEN пользователь увеличивает значение «Света» в режиме «Свет»
  • THEN яркие участки в зоне виньетки сохраняют яркость

Scenario: Нулевая сила виньетки

  • WHEN сила виньетки равна нулю
  • THEN виньетка не влияет на изображение независимо от остальных параметров

Requirement: Зерно

Клиент SHALL позволять добавлять зерно с силой, размером и шероховатостью в диапазоне 0..100 (по умолчанию размер 25, шероховатость 50). Зерно SHALL быть детерминированным: повторный рендер одних и тех же параметров SHALL давать одинаковый шум.

Scenario: Добавление зерна

  • WHEN пользователь увеличивает силу зерна
  • THEN на изображении появляется шум, заметный в средних тонах

Scenario: Размер и шероховатость

  • WHEN пользователь меняет размер или шероховатость зерна
  • THEN меняются крупность и контрастность шума

Scenario: Детерминированность зерна

  • WHEN сервер повторно рендерит фото с теми же параметрами зерна
  • THEN рисунок шума совпадает с предыдущим рендером

Scenario: Нулевая сила зерна

  • WHEN сила зерна равна нулю
  • THEN зерно не влияет на изображение

Requirement: Живой предпросмотр эффектов

Клиент SHALL показывать эффекты в просмотрщике до завершения серверного рендера. После готовности серверной версии клиент SHALL показывать её. Предпросмотр пространственных эффектов (текстура, чёткость, дымка) MAY отличаться от серверного рендера деталями, но SHALL передавать характер эффекта.

Scenario: Эффекты видны сразу

  • WHEN пользователь двигает ползунок эффекта
  • THEN просмотрщик обновляет изображение без ожидания серверного рендера

Scenario: Серверная версия заменяет предпросмотр

  • WHEN серверный рендер эффектов завершён
  • THEN просмотрщик показывает серверную версию

Scenario: Предпросмотр без WebGL

  • WHEN аппаратное ускорение недоступно
  • THEN клиент показывает эффекты доступным способом или показывает их после серверного рендера, не блокируя интерфейс

Requirement: Свёрнутые секции редактора

Редактор SHALL показывать все сворачиваемые секции инструментов свёрнутыми по умолчанию. Клиент SHALL сохранять состояние каждой секции (свёрнута или развёрнута) в браузере пользователя и восстанавливать его при повторном открытии редактора и перезагрузке страницы. Состояние SHALL NOT зависеть от выбранного фото.

Scenario: Первое открытие редактора

  • WHEN пользователь впервые открывает редактор фото
  • THEN все секции инструментов («Свет», «Цвет», «Эффекты» и их вложенные блоки) свёрнуты

Scenario: Состояние запоминается

  • WHEN пользователь разворачивает секцию «Эффекты» и перезагружает страницу
  • THEN секция «Эффекты» остаётся развёрнутой

Scenario: Состояние переживает смену фото

  • WHEN пользователь переключает фото в редакторе
  • THEN свёрнутость секций не меняется

Requirement: Редактирование только из просмотрщика

Клиент SHALL показывать вкладку «Редактирование» только когда фото открыто в просмотрщике. В режиме сетки правая панель SHALL показывать только «Сведения» и SHALL NOT отображать инструменты редактирования.

Scenario: Фото выбрано в сетке

  • WHEN пользователь выбирает фото в сетке, не открывая просмотрщик
  • THEN в правой панели отображается только вкладка «Сведения»

Scenario: Фото открыто в просмотрщике

  • WHEN пользователь открывает фото в просмотрщике
  • THEN в правой панели доступны «Сведения» и «Редактирование»

Scenario: Возврат из просмотрщика в сетку

  • WHEN пользователь возвращается из просмотрщика в сетку
  • THEN вкладка «Редактирование» скрыта, панель показывает «Сведения»