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

6.5 KiB
Raw Blame History

План: третья волна EASY — трансформации, свет, SVG

СТАТУС: ВЫПОЛНЕН 24.08.2026.

1. Что получается

Одиннадцать новых инструментов: свободные трансформации формы (наклон, поворот на произвольный угол, зум, сдвиг), светокоррекция (гамма, автоконтраст, температура, тонирование), виньетка, эффект «артефактов сжатия» и вход SVG. Каталог вырастает с 58 до ~69.

Текстовые инструменты и водяные знаки в волну не входят — им нужен рендер текста на канвасе, это отдельная четвёртая волна.

2. Новое ядро

  • Аффинные трансформации (core/affine.ts): единая функция обратного отображения — для каждого пикселя результата вычисляется исходная координата матрицей и семплируется билинейно (общий семплер, вынесенный из resize). Поверх неё: наклон по осям, поворот на произвольный угол (с расширением холста под новые габариты), зум к центру, сдвиг.
  • Свет и цвет (core/color.ts дополнения): гамма-коррекция через LUT, автоконтраст (растяжка по гистограмме яркости с отсечкой хвостов), температура (множители тёплых/холодных каналов), тонирование (умножение RGB на цвет с сохранением яркостного баланса).
  • Виньетка (core/effects.ts): радиальное затемнение от центра, сила слайдером; чистая математика без canvas.
  • IO-расширения (core/io.ts): декодирование SVG из текста/файла через blob-URL и Image; раундтрип «закодировать JPEG с качеством Q → декодировать обратно» для эффекта артефактов сжатия.

3. Инструменты — 11

  • Геометрия: skew-png (углы X/Y), rotate-free-png (любой угол, холст расширяется), zoom-png (масштаб ≥100 % к центру), shift-png (сдвиг со смещением содержимого).
  • Фильтры: vignette-png (сила затемнения), jpeg-artifacts-png (имитация пережатия).
  • Цвет: gamma-png (0.13.0), auto-contrast-png (без параметров), temperature-png (−100 тёплый…+100 холодный или наоборот — подпись честная), tint-png (цвет + сила).
  • Конвертация: svg-to-png (текст SVG слева, как base64-режим).

4. Этапы и проверки

  • A. Ядро — семплер, аффинный модуль, свет/цвет, эффекты + точные тесты: поворот квадрата на 90° совпадает с существующим rotate90, зум ×2 удваивает размеры и центр остаётся центром, гамма 1 — идентичность, автоконтраст растягивает известный диапазон, виньетка симметрична и не трогает центр при нулевой силе. Проверка: pnpm test/check.
  • B. IO — SVG-декод и JPEG-раундтрип. Проверка: сборка; живой прогон на этапе D.
  • C. Реестр — одиннадцать записей, иконки, тесты целостности. Проверка: test/build, страницы в экспорте.
  • D. Итог — полный прогон, смоук §7.

5. Смоук-чеклист

  1. Наклон X/Y по отдельности и вместе — форма искажается предсказуемо, без чёрных полос при малых углах.
  2. Поворот на 30° — холст вырос, углы прозрачны, содержимое повернуто.
  3. Зум 200 % — содержимое увеличено к центру, холст прежнего размера, края обрезаны.
  4. Сдвиг уводит содержимое за край, противоположный край заполняется фоном.
  5. Гамма 0.5 темнее, 2.0 светлее, 1.0 — без изменений.
  6. Автоконтраст на тусклом фото вытягивает диапазон.
  7. Температура ±50 заметно теплеет/холодеет.
  8. Тонирование красным даёт равномерный оттенок, белые области окрашиваются сильнее всего.
  9. Виньетка затемняет только края, центр не трогает.
  10. Артефакты: качество 10 даёт видимые квадраты JPEG.
  11. SVG вставленный слева декодируется в результат справа; битый SVG — баннер.
  12. Все новые инструменты работают в цепочке и скачиваются из своих секций.

6. Критерии готовности

  • Одиннадцать инструментов работают и покрыты юнит-тестами ядра (кроме IO-дом-части).
  • Аффинные операции опираются на общий билинейный семплер; дублирования сэмплинга нет.
  • Каталог ~69 инструментов; test/check/build зелёные, смоук §5 пройден.

7. Что сознательно не делаем

  • Рендер текста, водяные знаки, штампы — четвёртая волна (DOM-текст).
  • Субпиксельная точность аффинных трансформаций сверх билинейного семплинга.
  • Пакетное применение и пресеты.