doupian6118
doupian6118
2013-07-26 00:32

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 doujiong3146 8年前

    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;
    }
    
    点赞 评论 复制链接分享

为你推荐