Как читать SVG с заданным размером, используя PHP Imagick? - PullRequest
3 голосов
/ 10 февраля 2012

У меня есть следующий код:

$image = new Imagick();
$image->setBackgroundColor(new ImagickPixel('green'));
$image->setSize(20,20);
$image->readImageBlob(file_get_contents('./some/path/image.svg'));

Он отлично загружает SVG, но setSize просто игнорируется.Он рендерит с разрешением 550x100, согласно определению:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    width="550px" height="100px" viewBox="0 0 550 100" 
    enable-background="new 0 0 550 100" xml:space="preserve">

У кого-нибудь есть опыт получения SVG файлов для приятного воспроизведения с setSize?

Ответы [ 2 ]

6 голосов
/ 21 сентября 2012

Функция setSize () предназначена только для необработанных форматов изображений, но не для SVG. Вам нужно использовать scaleImage () вместо ...

$image = new Imagick();
$image->setBackgroundColor(new ImagickPixel('green'));
$image->readImage('./some/path/image.svg');
$image->scaleImage(20,20);

Между прочим, это будет работать нормально, если вы уменьшаете размер SVG-изображения до меньшего размера (как в данном случае), поскольку для любого, кто его масштабирует, вам нужно сделать еще одну вещь. Если вы просто измените размер, как указано выше, он будет выглядеть неровным и пиксельным. В этом случае вам нужно использовать setResolution () для увеличения разрешения следующим образом:

$image = new Imagick();
$image->setResolution(2000,2000);
$image->setBackgroundColor(new ImagickPixel('green'));
$image->readImage('./some/path/image.svg');
$image->scaleImage(1000,1000);

Фактические значения для setResolution () должны быть вычислены как 72 * (final_size / original_size) (ну, я думаю, что это правильная формула в любом случае). Но любое значение, которое по крайней мере это значение или выше, также будет работать нормально.

3 голосов
/ 04 октября 2012

Относительно увеличения SVG: с моей текущей настройкой ( ImageMagick 6.7.8-1 2012-10-03 Q16 с SVG rw+) SVG сохранен с разрешением 90x30 пикселей не может быть увеличен даже с setResolution() и setImageResolution(). Если я вместо этого заново сохраню SVG в большем размере, например 9000x3000, я могу смело увеличивать или уменьшать его с помощью приведенных выше инструкций.

...