Как преобразовать большой SVG файл в плиточный PNG? - PullRequest
6 голосов
/ 26 июня 2010

У меня большой SVG-файл (около 60 МБ, 10000x10000 пикселей, но с потенциалом для увеличения), и я хочу создать, скажем, много плиточных 256x256 PNG-изображений из него (в этом примере было бы быть 1600 изображений; раунд (10000/256) ^ 2).

Кто-нибудь имеет представление о том, как сделать это на веб-сервере (помимо прочего, с использованием PHP)? Я думал о rsvg, но, похоже, у него нет никаких функций для изменения ограничивающей рамки (и я бы предпочел не делать это вручную для каждого раздела). Возможно, ImageMagick сможет это сделать, но мне не очень повезло с тем, чтобы заставить его работать. Использование rsvg для создания большого PNG, а затем использование инструмента, предназначенного для мозаичного изображения очень больших изображений, может сработать, но мне не повезло найти такую ​​вещь! Скорость на самом деле не проблема, хотя это и желательно, поэтому, если худшее дойдет до худшего, я мог бы посмотреть на изменение ограничивающего прямоугольника SVG для каждого раздела. Впрочем, я мог видеть, что поколение берет навсегда!

Кто-нибудь знает какие-либо способы сделать это?

Изменить 2016-03-02:

Недавно я снова вернулся к необходимости ответа на этот вопрос, и Inkscape, по-видимому, является единственным инструментом, который может визуализировать SVG для заданной области при заданных размерах (svgexport почти соответствует этим требованиям, но это не позволяет вам изменить соотношение сторон).

Моя цель состояла в том, чтобы разбить SVG на плитки размером 256x256, и теперь я успешно создал скрипт, который может разбивать произвольно большие SVG, выполняя повторные рендеринг в inkscape размером около 16 000 x 16 000 и разбивая получающиеся изображения на фрагменты. Я успешно рендерил SVG с размерами более 500 000 x 500 000 пикселей - никаких проблем с использованием памяти (это занимает много времени!)

Ответы [ 5 ]

9 голосов
/ 23 июля 2010

inkscape имеет режим командной строки для экспорта pngs, принимая необязательный аргумент для выбора области для экспорта

inkscape vector.svg --export-png=raster.png --export-area=0:0:100:100
1 голос
/ 26 июня 2010

Я бы посмотрел на Apache Batik . В частности, их SVG Rasterizer выглядит как раз то, что вам нужно.

Я никогда не использовал его для гигантских файлов SVG, поэтому я не знаю, оптимизирован ли он для этого случая или нет.

0 голосов
/ 27 августа 2012

Возможно, вы захотите отредактировать исходные свойства вашего SVG (копии), чтобы отображать только определенные области.Используйте свойства «width» и «height», чтобы соответствовать желаемому размеру плитки (256) и «viewBox» для требуемой области плитки (например, «viewBox =« 512 256 768 512 ») для 3-й плитки во второй строке).Вы можете сделать что-то подобное в цикле:

$sed = "sed 's/width=\"10000\"/width=\"256\"' ".$sourcefile;
$sed .= " | sed 's/height=\"10000\"/height=\"256\"'";
$sed .= " | sed 's/viewBox=\"0 0 10000 10000\"/viewBox=\"0 0 256 256\"'";
exec($sed." > ".$tmpfile);
exec('rsvg '.$tmpfile.' > '.$tilefile);

Я не знаю, как это ведет себя с очень большими файлами.

0 голосов
/ 15 мая 2012

Проверьте этот вопрос, который я написал ранее и получил работу.

Если изображение имеет размер только 10000x10000, скрипт, который у меня есть в вопросе, работает лучше всего.

Если вы хотите использовать гораздо большеИзображения проверьте скрипт в моем anser.

ImageMagick обрезать огромное изображение

0 голосов
/ 18 апреля 2012

PanoJS , кажется, делает то, о чем вы спрашиваете. Вам необходимо сначала преобразовать SVG в большой PNG (например, используя inkscape в командной строке), а затем использовать создателя плитки PanoJS для создания плиток. Это зверь с большим объемом памяти, но если вы можете заставить его работать успешно, вы можете использовать код PanoJS Javascript, чтобы указать на ваш веб-сервер. XKCD использовал его для большого изображения, описывающего деньги .

...