Files
easy-png-tools/docs/archive/plan-medium-wave1.md
T
2026-08-24 07:47:34 +05:00

7.3 KiB

План: MEDIUM-волна №1 — удаление фона, размытие, резкость + Web Worker

СТАТУС: ВЫПОЛНЕН 2026-08-23.

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²)) — трёхпроходного боксового приближения достаточно визуально и оно быстрее.
  • Хромакей по нескольким цветам, ИИ-сегментация — следующие волны.
  • Отмена выполняющегося прогона воркера — устаревшие результаты отбрасываются токеном, сама работа завершается фоном.