mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 13:36:36 +00:00
88 lines
6.5 KiB
Markdown
88 lines
6.5 KiB
Markdown
# План: третья волна 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. Смоук-чеклист
|
||
|
||
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-текст).
|
||
- Субпиксельная точность аффинных трансформаций сверх билинейного семплинга.
|
||
- Пакетное применение и пресеты.
|