Я использую 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>
Почему так?
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
выход.
Других решений пока нет …