Imagick не может писать файлы SVG

0

Я использую Imagick, чтобы открыть изображение, изменить его размер, установить формат изображения (если это необходимо) и записать в другую папку результат. Он работает с ICO и PNG, но не может писать файлы SVG, говоря, что

ImagickException: невозможно записать файл: C:\Sites\devdesktop\test\sites\default\files\tempimages\abstract-spiral-striped-background-100.svg в Imagick-> writeimage() (строка 44 из C:\сайты\devdesktop\тест\сайтов\все\модули\testmodule\testmodule.module).

Это сообщение об ошибке от Drupal 7.

Вот мой код:

$file = file_load($form_state['values']['fid']);
$image = new Imagick(drupal_realpath($file->uri));
$image->setImageFormat($type[$type_num]);
$image->resizeImage($size[$size_num], $size[$size_num], Imagick::FILTER_UNDEFINED, 1);
$destination = 'public://tempimages/'.substr($file->filename, 0, -4).'-'.$size[$size_num].'.'.$type[$type_num];
$image->writeImage(drupal_realpath($destination));    //<---problem
drupal_goto(base_path().'/sites/default/files/tempimages/'.substr($file->filename, 0, -4).'-'.$size[$size_num].'.'.$type[$type_num]);

Этот фрагмент кода отлично работает с ICO и PNG, но не записывает файл в формате SVG, кроме небольшого количества кода

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="200" height="200">
<g style="</svg> 

Почему так?

Теги:
image-processing
svg
imagemagick
imagick

1 ответ

1
Лучший ответ

SVG - это не изображение так же, как JPG или PNG.

Это просто xml с нанесенными точками в большинстве случаев и обычно не имеет размерности и разрешения.

width и height 200 - это только размер в px в которых он был сохранен. Поэтому вам не нужно "изменять размер" svg, поскольку он будет масштабироваться бесконечно.

Если вы поместите SVG в тег img и определите размеры, например:

<img src="myawesome.svg" width="500" height="500"/>

Несмотря на то, что он определен в SVG как имеющий размер 200, он должен увеличиваться или уменьшаться без изменения качества внешнего вида.

Из-за этой полной разницы в структуре он не будет следовать тем же правилам в некоторых случаях, что и jpg или png, поскольку они представляют собой изображения.

Если это делается в Drupal; сделать исключение для SVG который просто сохраняет файл без изменения размера и добавляет размеры, где он будет напечатан для всех изображений. Это не повредит отображаемым изображениям, и это должно показать SVG как тот же размер, что и они.

TL; DR SVG - это xml файл, а не изображение, изменение размера оно бессмысленно, поскольку оно не имеет реального разрешения или размера и может масштабироваться бесконечно. Они кажутся похожими, поскольку они оба являются визуальными элементами. Создайте исключение для SVG чтобы он просто сохранил файл, и, когда печатаются визуализированные изображения или SVG, добавьте измененные размеры в вывод img.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню