如何扩展SVG并保存为PNG,使用PHP而不会丢失质量?

时间:2014-01-16 20:04:23

标签: php svg png imagick

我有一批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仍然模糊

有没有人找到方法让这项工作?

2 个答案:

答案 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应该将其自身重新缩放到新的大小。