Мне нужно получить координаты (x, y верхнего левого угла и ширины / высоты) пути SVG в PHP.
Я имею в виду d-атрибут в узле пути SVG-файла, например:
<path d="M 100 100 L 300 100 L 200 300 z" />
Мои пути довольно сложны для этого сами (некоторые имеют абсолютные и / или относительные координаты, возможные кривые и т. Д.),
Существуют ли библиотеки для такого рода работы в PHP?
Я искал решение для этого, и это лучшее, что я нашел до сих пор: http://rrbits.com/epb/2011/02/06/get-the-bounding-box-of-an- SVG-путь /
Он преобразует SVG в растровое изображение, а затем находит bbox с помощью ImageMagic. Я думал о том, чтобы писать сам, используя d-координаты, но я боюсь, что он потерпит неудачу на кривых и т. Д.
Я думаю, что это решение проблемы настолько просто, что это должно быть неправильно ;)
. Но, хотя я не пробовал, мне это кажется очень хорошим. Просто установите inkscape
на свой сервер, а затем запустите:
inkscape --without-gui --query-all /path/to/doc.svg
Согласно справке, это будет List id,x,y,w,h for all objects
– звучит как то, что мне нужно, а также то, что здесь предлагается! Пример вывода:
Layer_1,1.8032746e-06,-0.002,780.37099,455.91999 g4,0.090994976,-72.489183,72.445768,72.454697 polygon6,2.125,-70.896,69,69 polygon8,2.125,-70.896,69,69 g10,0.090994976,-72.489183,64.778768,3.5796973 path12,61.423995,-72.489183,3.4457675,3.5796973 path14,53.756995,-72.489183,3.4457675,3.5796973 path16,46.090995,-72.489183,3.4457675,3.5796973 path18,38.423995,-72.489183,3.4457675,3.5796973 ....
Это достаточно быстро, чтобы вызвать веб-запрос, но если у вас есть много возможностей для загрузки, вы можете легко подтолкнуть его к фоновому процессу.
Если ваша фигура не использует дуги или безье (многие фигуры на самом деле используют прямые линии для приближения кривых), вы можете использовать эту функцию PHP для вычисления ограничивающей рамки: http://pastebin.com/8eLQccbg
Не чистый PHP, но вариант, который работал для меня, состоял в том, чтобы использовать http://phantomjs.org для получения ограничивающего прямоугольника SVG.