mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 21:46:35 +00:00
6.5 KiB
6.5 KiB
План: третья волна 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.1–3.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. Смоук-чеклист
- Наклон X/Y по отдельности и вместе — форма искажается предсказуемо, без чёрных полос при малых углах.
- Поворот на 30° — холст вырос, углы прозрачны, содержимое повернуто.
- Зум 200 % — содержимое увеличено к центру, холст прежнего размера, края обрезаны.
- Сдвиг уводит содержимое за край, противоположный край заполняется фоном.
- Гамма 0.5 темнее, 2.0 светлее, 1.0 — без изменений.
- Автоконтраст на тусклом фото вытягивает диапазон.
- Температура ±50 заметно теплеет/холодеет.
- Тонирование красным даёт равномерный оттенок, белые области окрашиваются сильнее всего.
- Виньетка затемняет только края, центр не трогает.
- Артефакты: качество 10 даёт видимые квадраты JPEG.
- SVG вставленный слева декодируется в результат справа; битый SVG — баннер.
- Все новые инструменты работают в цепочке и скачиваются из своих секций.
6. Критерии готовности
- Одиннадцать инструментов работают и покрыты юнит-тестами ядра (кроме IO-дом-части).
- Аффинные операции опираются на общий билинейный семплер; дублирования сэмплинга нет.
- Каталог ~69 инструментов;
test/check/buildзелёные, смоук §5 пройден.
7. Что сознательно не делаем
- Рендер текста, водяные знаки, штампы — четвёртая волна (DOM-текст).
- Субпиксельная точность аффинных трансформаций сверх билинейного семплинга.
- Пакетное применение и пресеты.