mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 13:36:36 +00:00
96 lines
6.7 KiB
Markdown
96 lines
6.7 KiB
Markdown
# План: 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-маски и градиентные обводки.
|