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

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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误