docs: add new plan
This commit is contained in:
@@ -0,0 +1,66 @@
|
|||||||
|
# План: MEDIUM-волна №1 — удаление фона, размытие, резкость + Web Worker
|
||||||
|
|
||||||
|
> Статус: план к выполнению.
|
||||||
|
|
||||||
|
## 1. Зачем
|
||||||
|
|
||||||
|
- Первые операции настоящего алгоритмического уровня: свёртки и заливка связной области.
|
||||||
|
- Витринная фича каталога — удаление однотонного фона без нейросетей: порог по цвету + заливка от краёв изображения + сглаживание границы маски.
|
||||||
|
- Эти операции реально блокируют UI-поток на больших картинках — повод включить давно подготовленный путь: исполнитель `executeStep` переезжает в Web Worker, страницы не меняются вовсе.
|
||||||
|
|
||||||
|
## 2. Инструменты — 3
|
||||||
|
|
||||||
|
- **Удалить фон PNG** (`remove-background-png`, категория «Прозрачность») — параметры: цвет фона, допуск похожести %, режим «только внешние области» (заливка от краёв вместо глобального совпадения), сглаживание границы (проходы мажоритарного фильтра маски). Даёт превью маски через существующий контракт `preview`.
|
||||||
|
- **Размытие PNG** (`blur-png`, новая категория «Фильтры») — гауссово приближение тремя проходами разделяемого бокса; радиус слайдером 1–32 px.
|
||||||
|
- **Резкость PNG** (`sharpen-png`, «Фильтры») — свёртка ядром резкости с регулируемой силой (смесь исходного и обработанного), сила слайдером 0–100 %.
|
||||||
|
|
||||||
|
## 3. Новое ядро (чистые функции, детерминированные, покрытые тестами)
|
||||||
|
|
||||||
|
- `core/convolution.ts`
|
||||||
|
- универсальная свёртка с клампом краёв;
|
||||||
|
- разделяемый бокс-блюр и сборка гауссова приближения из трёх проходов;
|
||||||
|
- ядро резкости и смешивание с оригиналом по силе.
|
||||||
|
- `core/background.ts`
|
||||||
|
- построение маски удаления по цветовому расстоянию (та же метрика, что у удаления цвета);
|
||||||
|
- заливка связной области от всех граничных пикселей (очередь, без рекурсии);
|
||||||
|
- мажоритарное сглаживание маски заданным числом проходов;
|
||||||
|
- сборка результата: альфа 0 у удалённых пикселей; плюс функция маски для превью.
|
||||||
|
|
||||||
|
## 4. Web Worker
|
||||||
|
|
||||||
|
- Точка исполнения одна — `tools/executor.ts`; меняется только её внутренность.
|
||||||
|
- Воркер-файл импортирует реестр и исполняет операцию по `toolId`; картинка приходит копией (структурный клон), результат возвращается передаваемым буфером.
|
||||||
|
- Ленивая инициализация воркера при первом вызове; если воркер недоступен (старый браузер/тестовая среда) — автоматический откат на прямое исполнение в главном потоке. Обе ветви обязаны давать побайтово одинаковый результат.
|
||||||
|
- Генераторы и текстовые представления остаются в главном потоке — они мгновенные.
|
||||||
|
- Пипетка и лупа работают с уже готовыми картинками и не зависят от переноса.
|
||||||
|
|
||||||
|
## 5. Этапы и проверки
|
||||||
|
|
||||||
|
- **A. Ядро** — свёртки и фон с тестами на малых матрицах (точные ожидания руками). Проверка: `pnpm test/check`.
|
||||||
|
- **B. Реестр** — категория «Фильтры», три записи, превью маски. Проверка: тесты целостности, визуально.
|
||||||
|
- **C. Web Worker** — перенос исполнителя, отккат-ветвь. Проверка: результаты до/после переключения идентичны байт-в-байт на фиксированной картинке и параметрах; `test/build` зелёные.
|
||||||
|
- **D. Итог** — полный прогон и смоук §8.
|
||||||
|
|
||||||
|
## 6. Смоук-чеклист
|
||||||
|
|
||||||
|
1. Размытие: радиус 1 и 32 — плавно усиливается, прозрачные края не темнеют.
|
||||||
|
2. Резкость: сила 0 не меняет картинку; сила 100 заметно подчёркивает края без цветового мусора.
|
||||||
|
3. Удаление фона на логотипе с однотонным фоном: фон исчез, содержимое цело.
|
||||||
|
4. Режим «только внешние области»: дырка внутри объекта того же цвета остаётся непрозрачной.
|
||||||
|
5. Сглаживание 0/2/4 прохода — граница от жёсткой к мягкой, результат воспроизводим.
|
||||||
|
6. Превью маски показывает белым удаляемую область; скачивание всегда отдаёт результат.
|
||||||
|
7. Во время размытия большой картинки интерфейс остаётся отзывчивым (чип «Пересчёт…», скролл живой).
|
||||||
|
8. Цепочка: размытие → резкость → удаление фона работает; каждый блок скачивает свой промежуток.
|
||||||
|
9. Регресс старых инструментов и главной-поиска без изменений поведения.
|
||||||
|
|
||||||
|
## 7. Критерии готовности
|
||||||
|
|
||||||
|
- Три новых инструмента проходят смоук §6; операции ядра покрыты точными юнит-тестами.
|
||||||
|
- Исполнение изображений идёт через воркер там, где он доступен, с гарантированно одинаковым результатом обеих ветвей.
|
||||||
|
- `test/check/build` зелёные.
|
||||||
|
|
||||||
|
## 8. Что сознательно не делаем
|
||||||
|
|
||||||
|
- Многопроходное гауссово ядро «по-настоящему» (O(r²)) — трёхпроходного боксового приближения достаточно визуально и оно быстрее.
|
||||||
|
- Хромакей по нескольким цветам, ИИ-сегментация — следующие волны.
|
||||||
|
- Отмена выполняющегося прогона воркера — устаревшие результаты отбрасываются токеном, сама работа завершается фоном.
|
||||||
Reference in New Issue
Block a user