From 3d7371492fe705b85e9d0ef2716d647dddf3c134 Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Mon, 24 Aug 2026 07:04:22 +0500 Subject: [PATCH] docs: add new plan --- docs/plan-medium-wave1.md | 66 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/plan-medium-wave1.md diff --git a/docs/plan-medium-wave1.md b/docs/plan-medium-wave1.md new file mode 100644 index 0000000..1890e20 --- /dev/null +++ b/docs/plan-medium-wave1.md @@ -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²)) — трёхпроходного боксового приближения достаточно визуально и оно быстрее. +- Хромакей по нескольким цветам, ИИ-сегментация — следующие волны. +- Отмена выполняющегося прогона воркера — устаревшие результаты отбрасываются токеном, сама работа завершается фоном.