# План: 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. Смоук-чеклист 1. Обводка толщиной 3 вокруг круглого стикера — ровное кольцо выбранного цвета, без угловатости. 2. Толщина 1 — тонкая аккуратная линия; 10 — толстая, форма содержимого не искажается сверх роста. 3. Контур показывает только край содержимого линией. 4. Толще/тоньше на тонкой надписи — штрихи растут/сжимаются без разрывов при умеренных значениях. 5. Жёсткие края: полупрозрачность исчезает, силуэт сохраняется. 6. Убрать мусор убирает одиночные точки-крапинки, не трогая крупные области. 7. Закрыть дыры заполняет одиночные прозрачные точки внутри логотипа. 8. Цепочка: обводка после удаления фона работает; каждое звено скачивает свой промежуток. 9. Регресс остальных инструментов без изменений. ## 8. Что сознательно не делаем - Морфология по яркости для непрозрачных сканов — волна фокусируется на альфе прозрачных PNG. - Выбор структурирующего элемента пользователем — всегда диск. - Feather/свечение краёв — отдельная будущая задача поверх размытия. - Произвольные SVG-маски и градиентные обводки.