doupian6118 2013-07-26 00:32
浏览 293
已采纳

iMagick PHP从SVG转换为JPG

I am working in PHP and trying to use iMagick library to do an image conversion from SVG to JPG using shell_exec command. All seems to work, but the output JPG comes out very distorted. I almost get a feeling that the image is first converted and then resized.

I tried using "resize" and "scale" with same results.

Here is the command:

"-resize 800x800 -quality 95 image.svg image.jpg"

Any insights? Thanks in advance.

  • 写回答

1条回答 默认 最新

  • doujiong3146 2013-08-02 02:05
    关注

    For anyone looking for a solution to this. Someone was able to come up with the following hack (with some of my edits):

    createThumbnail("input.svg", "output.jpg", 500, 500, $cdn_container);
    
    function createThumbnail($filename, $thname, $width=100, $height=100, $cdn=null)
    {
        try {
            $extension = substr($filename, (strrpos($filename, '.')) + 1 - strlen($filename));
            $fallback_save_path = "images/designs";
    
            if ($extension == "svg") {
                $im = new Imagick();
                $svgdata = file_get_contents($filename);
                $svgdata = svgScaleHack($svgdata, $width, $height);
    
                //$im->setBackgroundColor(new ImagickPixel('transparent'));
                $im->readImageBlob($svgdata);
    
                $im->setImageFormat("jpg");
                $im->resizeImage($width, $height, imagick::FILTER_LANCZOS, 1);
    
                $raw_data = $im->getImageBlob();
    
                (is_null($cdn)) ? file_put_contents($fallback_save_path . '/' . $thname, $im->getImageBlob()) : '';
            } else if ($extension == "jpg") {
                $im = new Imagick($filename);
                $im->stripImage();
    
                // Save as progressive JPEG
                $im->setInterlaceScheme(Imagick::INTERLACE_PLANE);
                $raw_data = $im->resizeImage($width, $height, imagick::FILTER_LANCZOS, 1);
    
                // Set quality
                // $im->setImageCompressionQuality(85);
    
                (is_null($cdn)) ? $im->writeImage($fallback_save_path . '/' . $thname) : '';
            }
    
            if (!is_null($cdn)) {
                $imageObject = $cdn->DataObject();
                $imageObject->SetData( $raw_data );
                $imageObject->name = $thname;
                $imageObject->content_type = 'image/jpg';
                $imageObject->Create();
            }
    
            $im->clear();
            $im->destroy();
            return true;
        }
        catch(Exception $e) {
            return false;
        }
    }
    
    function svgScaleHack($svg, $minWidth, $minHeight)
    {
        $reW = '/(.*<svg[^>]* width=")([\d.]+px)(.*)/si';
        $reH = '/(.*<svg[^>]* height=")([\d.]+px)(.*)/si';
        preg_match($reW, $svg, $mw);
        preg_match($reH, $svg, $mh);
        $width = floatval($mw[2]);
        $height = floatval($mh[2]);
        if (!$width || !$height) return false;
    
        // scale to make width and height big enough
        $scale = 1;
        if ($width < $minWidth)
            $scale = $minWidth/$width;
        if ($height < $minHeight)
            $scale = max($scale, ($minHeight/$height));
    
        $width *= $scale*2;
        $height *= $scale*2;
    
        $svg = preg_replace($reW, "\${1}{$width}px\${3}", $svg);
        $svg = preg_replace($reH, "\${1}{$height}px\${3}", $svg);
    
        return $svg;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签)
  • ¥50 sft下载大文阻塞卡死
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失
  • ¥15 springboot+vue 集成keycloak sso到阿里云
  • ¥15 win7系统进入桌面过一秒后突然黑屏
  • ¥30 backtrader对于期货交易的现金和资产计算的问题
  • ¥15 求C# .net4.8小报表工具
  • ¥15 安装虚拟机时出现问题