6.7 KiB
План: MEDIUM-волна №2 — морфология прозрачности
СТАТУС: ВЫПОЛНЕН 2026-08-23.
1. Зачем
Одна пара функций — расширение и сужение непрозрачных областей — открывает целое семейство пользовательских операций: обводка логотипов и иконок, контуры, утолщение и утончение подписей, удаление мелкого мусора и закрытие дырок. Всё это частые запросы в наборах PNG-утилит, а ядро получается компактным и легко покрывается тестами.
2. Инструменты — 7 (все в категории «Прозрачность»)
- Обвести PNG (
add-stroke-png) — кольцо выбранного цвета вокруг непрозрачного содержимого; параметры: цвет, толщина 1–10 px. - Найти контур PNG (
find-contour-png) — линия по краю непрозрачных областей; параметр: толщина линии. - Утолщить PNG (
make-thicker-png) — расширение содержимого на N пикселей. - Утончить PNG (
make-thinner-png) — сужение содержимого на N пикселей. - Жёсткие края PNG (
harden-alpha-png) — бинаризация альфы по порогу: полупрозрачность уходит, остаётся два состояния. - Убрать мусор PNG (
despeckle-alpha-png) — открытие: удаляет одиночные полупрозрачные пиксели и мелкие крапинки. - Закрыть дыры PNG (
close-holes-png) — закрытие: заполняет одиночные прозрачные точки внутри объекта.
Все операции применяются к альфа-каналу; RGB пикселей сохраняется.
3. Ядро core/morphology.ts
Чистые функции над бинарной маской и над альфа-каналом:
buildAlphaMask(img)— 1 там, где альфа > 0.dilateMask(mask, w, h, radius, shape)— расширение;shape: квадрат или диск (для обводок диск даёт ровную круглую линию).erodeMask(...)— зеркальная операция.dilateImage / erodeImage(img, radiusPx)— применяют маскирование к альфе изображения, RGB сохраняется.- Сборщики:
- обводка:
dilate(mask) − mask→ новое кольцо заливается цветом; - контур:
mask − erode(mask)→ линия; - открытие:
erode → dilate; закрытие:dilate → erode.
- обводка:
hardenAlpha(img, thresholdPercent)— отдельно от морфологии, но той же волной.
Структурирующий элемент при радиусе r — диск радиуса r (расстояние до центра ≤ r); квадрат не используем, чтобы углы обводок не были угловатыми.
4. Web Worker
Ничего не требуется: новые операции попадают в реестр, исполнитель автоматически исполняет их в воркере. Тесты ядра идут мимо воркера (чистые функции).
5. Этапы и проверки
- A. Ядро —
morphology.ts+ точные тесты на матрицах 5×5: расширение диска, сужение, открытие убирает одиночный пиксель, закрытие закрывает одиночную дыру, кольцо обводки нужного цвета и толщины. Проверка:pnpm test/check. - B. Реестр — семь записей, тест целостности обновляется (51 → 58).
Проверка:
test/build, визуально. - C. Итог — полный прогон, смоук §7.
6. Критерии готовности
- Семь новых инструментов работают на прозрачных PNG: обводка, контур, толще/тоньше, жёсткие края, убрать мусор, закрыть дыры.
- Все операции детерминированы и покрыты юнит-тестами с ручными ожиданиями.
- Исполнение автоматически идёт в воркере.
test/check/buildзелёные, смоук §7 пройден.
7. Смоук-чеклист
- Обводка толщиной 3 вокруг круглого стикера — ровное кольцо выбранного цвета, без угловатости.
- Толщина 1 — тонкая аккуратная линия; 10 — толстая, форма содержимого не искажается сверх роста.
- Контур показывает только край содержимого линией.
- Толще/тоньше на тонкой надписи — штрихи растут/сжимаются без разрывов при умеренных значениях.
- Жёсткие края: полупрозрачность исчезает, силуэт сохраняется.
- Убрать мусор убирает одиночные точки-крапинки, не трогая крупные области.
- Закрыть дыры заполняет одиночные прозрачные точки внутри логотипа.
- Цепочка: обводка после удаления фона работает; каждое звено скачивает свой промежуток.
- Регресс остальных инструментов без изменений.
8. Что сознательно не делаем
- Морфология по яркости для непрозрачных сканов — волна фокусируется на альфе прозрачных PNG.
- Выбор структурирующего элемента пользователем — всегда диск.
- Feather/свечение краёв — отдельная будущая задача поверх размытия.
- Произвольные SVG-маски и градиентные обводки.