我有一批SVG图像,我需要调整大小,然后保存为PNG,我想用PHP来做。我们也提出了类似的问题,但没有一个解决方案适合我。例如:
选项A :使用PHP更改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(转换...)来解决PHP的错误
问题D :您猜对了,结果PNG仍然模糊
有没有人找到方法让这项工作?
答案 0 :(得分:1)
我使用'batik'库实现了类似的功能。
我已指定'感兴趣的区域',需要将其转换为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);
}
答案 1 :(得分:1)
对于选项A:
如果svg要求坐标系是创建时的坐标系(读取:原始宽度/高度),那么您需要添加viewBox
属性(使用0 0 originalwidth originalheight
) 。然后,当您设置新的宽度和高度属性时,svg应该将其自身重新缩放到新的大小。