Intereting Posts

Как я могу увеличить SVG и сохранять как PNG, с PHP без потери качества?

У меня есть пакет SVG-изображений, которые мне нужно изменить, а затем сохранить как PNG, и я бы хотел использовать PHP для этого. Схожие вопросы с моими были заданы, но ни одно из решений не работает для меня. Например:

параметр A : используйте PHP для изменения атрибута width и height SVG.

проблема с A : кажется, что она работает нормально, но на самом деле она увеличивает размер холста, а не содержимое холста. Я не уверен, что это важно, но мои SVG – это небольшая графика, созданная с помощью Illustrator, в основном состоящая из элементов пути.

вариант B : используйте imagick для изменения размера и сохранения

пример :

$im = new Imagick(); $im->setResolution( $startResolution * ($newWidth / $oldWidth ), $startResolution * ($newHeight / $oldHeight ) ); $im->readImage( $svgSource ); $im->setImageFormat("png32"); echo '<img src="data:image/png;base64,' . base64_encode($im) . '" />'; 

проблема с B : это тоже работает нормально, но результат png будет размытым

опция C : вариант варианта B, вы установите разрешение действительно высоким, например 5000, затем измените размер.

проблема с C : полученный PNG все еще размыт

опция D : использовать exec (convert …), чтобы обойти ошибки PHP

проблема с D : вы догадались, полученный PNG все еще размыт

Кто-нибудь нашел способ сделать эту работу?

Для варианта A:

Если svg ожидает, что система координат будет тем, чем она была, когда она была создана (прочитайте: оригинальная ширина / высота), вам нужно будет добавить атрибут viewBox (используйте 0 0 originalwidth originalheight ). Затем, когда вы устанавливаете новые атрибуты ширины и высоты, svg должен правильно масштабироваться до нового размера.

Я получил эту подобную вещь, используя библиотеку «батик».

Я указал «Область интересов», которую нужно преобразовать в Png. вот что я сделал.

  public function makeSvgtoPngImages() { $tempSVG_filename = $user_folder_path . 'temp.svg'; $tempSVG_handle = fopen($tempSVG_filename, 'w+'); fwrite($tempSVG_handle, $user_svg_content); fclose($tempSVG_handle); $mimetype = 'image/png'; $width =2000; $height=2000; $area_interest = '472,185,555,275'; // in my case i am using area of interest is my viewBox $result = shell_exec('java -jar /var/www/batik-1.7/batik-rasterizer.jar -m ' . $mimetype . ' -d ' . $outputfile . ' -w ' . $width . ' -h ' . $height . ' -a ' . $area_interest . ' ' . $tempSVG_filename . ' 2>&1'); unlink($tempSVG_filename); }