Я посылаю строковое представление файла SVG на сервер и с помощью Imagick, чтобы превратить это в формате JPEG следующим образом:как изменить размер SVG с Imagick/ImageMagick
$image = stripslashes($_POST['json']);
$filename = $_POST['filename'];
$unique = time();
$im = new Imagick();
$im->readImageBlob($image);
$im->setImageFormat("jpeg");
$im->writeImage('../photos/' . $type . '/humourised_' . $unique . $filename);
$im->clear();
$im->destroy();
Однако я хочу измените размер SVG до растеризации, чтобы получившееся изображение было больше размеров, указанных в файле SVG.
Я изменил свой код на следующее:
$image = stripslashes($_POST['json']);
$filename = $_POST['filename'];
$unique = time();
$im = new Imagick();
$im->readImageBlob($image);
$res = $im->getImageResolution();
$x_ratio = $res['x']/$im->getImageWidth();
$y_ratio = $res['y']/$im->getImageHeight();
$im->removeImage();
$im->setResolution($width_in_pixels * $x_ratio, $height_in_pixels * $y_ratio);
$im->readImageBlob($image);
$im->setImageFormat("jpeg");
$im->writeImage('../photos/' . $type . '/humourised_' . $unique . $filename);
$im->clear();
$im->destroy();
Этот код должен выработать решение и изменить размер SVG соответственно. Он отлично работает, если холст SVG и его элементы имеют ширину, основанную на процентах, однако она не работает с элементами, определенными в 'px'. К сожалению, это требование.
Типичная строка SVG, которая будет отправлена на сервер выглядит следующим образом:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/SVG/DTD/svg10.dtd">
<svg id="tempsvg" style="overflow: hidden; position: relative;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="333" version="1.1" height="444">
<image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="0" y="0" width="333" height="444" xlink:href="http://www.songbanc.com/assets/embed/photos/full/133578615720079914224f9e7aad9ac871.jpg"></image>
<image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="85.5" y="114" width="50" height="38" xlink:href="http://www.songbanc.com/assets/embed/humourise/elements/thumb/thumb_lips4.png"></image>
<path transform="matrix(1,0,0,1,0,0)" fill="none" stroke="#000" d="M110.5,133L140.5,133" stroke-dasharray="- " opacity="0.5"></path>
<circle transform="matrix(1,0,0,1,0,0)" cx="140.5" cy="133" r="5" fill="#000" stroke="#000"></circle>
<path transform="matrix(1,0,0,1,0,0)" fill="none" stroke="#000" d="M110.5,133L110.5,155.8" stroke-dasharray="- " opacity="0.5"></path>
<circle transform="matrix(1,0,0,1,0,0)" cx="110.5" cy="155.8" r="5" fill="#000" stroke="#000"></circle>
<circle transform="matrix(1,0,0,1,0,0)" cx="110.5" cy="133" r="5" fill="#000" stroke="#000"></circle>
</svg>
Как вы можете видеть элементы, которые составляют эту SVG имеет ширину определения пикселей и высоты (используя проценты, к сожалению, не вариант для этого приложения)
Есть ли способ обойти это? Или любой другой способ преобразования SVG в png и рендеринг его при заданном размере без потери качества.
Спасибо.
EDIT: Несмотря на то, что мне никогда не удавалось найти идеальное решение. Вместо этого я закончил передачу SVG-данных как json, прокручивая его на стороне сервера и масштабируя пиксели до предполагаемой высоты.
Затем, после долгих проб и ошибок, я понял, что у imagemagick были проблемы с стандартными командами трансформирования/поворота SVG, выбрасывая любые управляемые элементы из-под удара. В итоге я переключил слишком «inkscape», чтобы визуализировать полученный SVG как растрированное изображение. И все хорошо. Я все еще вникаю в потенциальное формульное решение, чтобы компенсировать различия, которые создает imagemagick. Если у меня будет какой-то успех, я снова обновлю этот вопрос.
Из [вашего другого вопроса] (http://stackoverflow.com/questions/10400897/how-to-convert-an-svg-string-into-a-jpg-with-inkscape) Я подозреваю, что у вас есть переключился на Inkscape (который может масштабировать изображение с помощью опций в командной строке). Если это так, добавили ли вы комментарий под вопрос? ':)'. – halfer
Действительно ... я отредактирую свой вопрос соответственно. :-) – gordyr
Хотелось бы увидеть более подробную информацию о вашем решении Inkscape! – supertrue