Files
easy-png-tools/docs/archive/plan-medium-wave2.md
T

6.7 KiB
Raw Blame History

План: 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-маски и градиентные обводки.