- PVSM.RU - https://www.pvsm.ru -
Иногда бывает нужно вычислить трансформацию над svg путем (сдвиг, масштаб и т.п.). Или слегка ужать его размер — заменить все команды на «относительные», урезать дробную часть координат и выкинуть лишние пробелы. Как ни странно, готовых библиотек для таких простых операций не было.
Самое ближайшее по смыслу можно найти в рафаэле [1] и SVGO [2]. Но в первом все переводится в безье третьего порядка (нормально для отображения, но плохо для сохранения результата), а второй работает на более высоком уровне, и будет для простых вещей неудобным и медленным.
В итоге, после выделения наработок в отдельный пакет, получился svgpath [3] с простым и понятным интерфейсом:
var svgpath = require('svggpath'); var result = svgpath(path) .scale(1, -1) .translate(50, 100) .abs().round(0).rel() .toString();
Обратите внимание на конструкцию .abs().round(0).rel()
— округлять можно только абсолютные значения, иначе погрешность станет копиться и полезут артефакты. Поэтому относительные команды сначала переводятся в абсолютные, а после огругления все конвертируется обратно, для уменьшения размера.
В общем, получилось компактно и довольно быстро. Для тех, кому понадобятся другие преобразования — есть итератор на подобии forEach, который передает в итерирующую функцию команды сегментов и координаты их начальных точек.
Код работает под нодой, но в то же время легко браузерифицируется (на fontello все крутится в браузере, проверено). Пока реализованы те преобразования, которые были востребованы. В перспективе наверное имеет смысл добавить парсинг и наложение команд transform, а также вычисление bounding box. Сейчас библиотека активно используется в конверторе шрифтов svg2ttf [4] и при обработке картинок на fontello [5].
Исходный код [3], лицензия MIT.
Автор: Vitaly
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/44565
Ссылки в тексте:
[1] рафаэле: http://raphaeljs.com/
[2] SVGO: https://github.com/svg/svgo
[3] svgpath: https://github.com/fontello/svgpath
[4] svg2ttf: https://github.com/fontello/svg2ttf
[5] fontello: http://fontello.com/
[6] Источник: http://habrahabr.ru/post/195692/
Нажмите здесь для печати.