Я использую 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
.