mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 13:36:36 +00:00
7.4 KiB
7.4 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 и 32 — плавно усиливается, прозрачные края не темнеют.
- Резкость: сила 0 не меняет картинку; сила 100 заметно подчёркивает края без цветового мусора.
- Удаление фона на логотипе с однотонным фоном: фон исчез, содержимое цело.
- Режим «только внешние области»: дырка внутри объекта того же цвета остаётся непрозрачной.
- Сглаживание 0/2/4 прохода — граница от жёсткой к мягкой, результат воспроизводим.
- Превью маски показывает белым удаляемую область; скачивание всегда отдаёт результат.
- Во время размытия большой картинки интерфейс остаётся отзывчивым (чип «Пересчёт…», скролл живой).
- Цепочка: размытие → резкость → удаление фона работает; каждый блок скачивает свой промежуток.
- Регресс старых инструментов и главной-поиска без изменений поведения.
7. Критерии готовности
- Три новых инструмента проходят смоук §6; операции ядра покрыты точными юнит-тестами.
- Исполнение изображений идёт через воркер там, где он доступен, с гарантированно одинаковым результатом обеих ветвей.
test/check/buildзелёные.
8. Что сознательно не делаем
- Многопроходное гауссово ядро «по-настоящему» (O(r²)) — трёхпроходного боксового приближения достаточно визуально и оно быстрее.
- Хромакей по нескольким цветам, ИИ-сегментация — следующие волны.
- Отмена выполняющегося прогона воркера — устаревшие результаты отбрасываются токеном, сама работа завершается фоном.