php 实现svg转化png格式的方法分析

吾爱主题 阅读:142 2021-09-26 13:53:00 评论:0

本文实例讲述了php 实现svg转化png格式的方法。分享给大家供大家参考,具体如下:

svg转png实现

1.php imagick扩展插件

a.研究imagick插件方法

?
1 2 3 4 5 6 7 8 9 10 11 $im = new Imagick( $upload_path . $file_name ); $svg = file_get_contents ( $upload_path . $file_name ); $svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . $svg ; $im ->readImageBlob( $svg ); // png settings $im ->setImageFormat( "png24" ); $srcImage = $im ->getImageGeometry(); //获取源图片宽和高 $im ->resizeImage( $srcImage [ 'width' ], $srcImage [ 'height' ], imagick::FILTER_LANCZOS, 1, false); $im ->writeImage( $upload_path . '/' . $topng_name . '.png' ); $im ->clear(); $im ->destroy();

b.遇到的问题

svg图片可以成功转化为png格式图片,但png图片存在问题:

1)线段丢失;

2)字体不展示;

3)svg文件中style标签样式不能解析;

2.弃用imagick插件,改为svg转canvas转png

a.svg转canvas

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function drawInlineSVG( $svg , callback) {    var svg = $svg ;    var parser = new DOMParser();    var doc = parser.parseFromString(svg, "text/xml" );    svg = doc.getElementsByTagName( 'svg' );    svg = svg[0];    svg.innerHTML = '<rect width="100%" height="100%" fill="#ffffff"></rect>' + svg.innerHTML;    var svgData = new XMLSerializer().serializeToString( svg );    var img = document.createElement( "img" );    img.setAttribute( "src" , "data:image/svg+xml;base64," + btoa( unescape(encodeURIComponent(svgData)) ) );    img.onload = function () {      var canvas = document.createElement( "canvas" );      canvas.width = img.width;      canvas.height = img.height;      var ctx = canvas.getContext( "2d" ); //取得画布的2d绘图上下文      ctx.drawImage( img, 0, 0 );      canvas.toDataURL( "image/png" );      var base64Src = canvas.toDataURL( "image/png" );      callback && callback(base64Src); // 调用回掉函数    };   return ; }

b.canvas转png(base64Src转化为png)

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /* base64格式编码转换为图片并保存对应文件夹 */ function base64_image_content( $base64_image_content , $path , $file_name = '' ){    //匹配出图片的格式    if (preg_match( '/^(data:\s*image\/(\w+);base64,)/' , $base64_image_content , $result )){      if (! file_exists ( $path )){        // 路径不存在       return false;      }      $new_file = $path . $file_name ;      if ( file_put_contents ( $new_file , base64_decode ( str_replace ( $result [1], '' , $base64_image_content )))){        return '/' . $new_file ;      } else {        return false;      }    } else {      return false;    } }

c.效果示例

1)svg格式

2)png格式

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://blog.csdn.net/a408492801/article/details/98954220

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容