美文网首页PHP DevPHP学习PHP实战
ECharts绘制的图形保存为图片

ECharts绘制的图形保存为图片

作者: 呆呆的木木 | 来源:发表于2017-01-15 14:15 被阅读19265次

    最近的项目需要导出文件,导出的文件里有数据分析图,如折线图,柱状图,散点图等。综合考虑之后,我选择了目前已经很成熟的也很流行的ECharts库。

    ECharts一个纯 Javascript 的图表库,它提供了绘制各种图形的方法方法,几乎囊括了所有的二维图形,用起来也很是方便。还提供了图片下载的功能。这里我们主要说的是图片下载。下面是我找到的一些方法总结以及它们的适用情况。

    1.用ECharts配置项手册中的toolbox.feature.saveAsImage

    因为是自带的,不需要怎么处理,直接用就好。示例:

    toolbox: {

      show: true,

      feature: {

        saveAsImage: {

        show:true,

        excludeComponents :['toolbox'],

        pixelRatio: 2

        }

      }

    }

    这一段一定要写在option中,这样会在图形右上角产生一个保存为图片的标识,点击即可下载图片,这种方法试用于网站点击保存的需求,效果如下图:

    saveAsImage测试效果图

    2.用ECharts实例方法getImage

    需要注意的是,这个功能在ECharts3中好像已经舍弃,作者用ECharts3没有出现任何效果,换成ECharts2的js文件才可以运行。示例:

    myChart.setOption(option);

    var picInfo = myChart.getImage();

    getImage要放在setOption方法生成一个简单的图形之后,我们怎么验证getImage是否生效了呢?

    方法a:万能的alert调试,这里 alert (picInfo); 的结果弹出的是[object HTMLImageElement],我们仍然不知道这里的对象是什么。

    方法b:页面中新定义一个容器,将得到的picInfo写入div,看看是什么结果:

    var picInfo = myChart.getImage();

    onload=function f(){

      document.getElementById("pic").appendChild(picInfo);

      //document.getElementById("pic").innerHTML = picInfo;

    }

    注意,这里的写入div,要用上面的方法写入上面定义的div。得到如下图所示:

    getImage得到的对象写入div

    如果用下面的方法写入,会在定义的div中出现[object HTMLImageElement],如下图:

    getImage得到的对象普通写入

    遗憾的是,这种方法得到的picInfo为[object HTMLImageElement],无法通过Ajax传递到后台处理,只能用于显示。因此,这种方法适用于一些网站绘制图形上下或者左右同步显示的需求。

    3.用ECharts实例方法getDataURL

    很显然,上面的两种情况并不能满足我现在图片自动保存的需求,下面说我最后解决方案。

    首先,我们用getDataURL得到图片信息:

    myChart.setOption(option);

    var picInfo = myChart.getDataURL();

    getDataURL仍然要放在setOption方法生成一个简单的图形之后,现在我们得到的picInfo是一串base64信息,我们设法将得到的picInfo用Ajax传递到后台处理,作者用的是php,因此,以php处理为例:

    新建一个文件,取名test.php,(请把此文件放在可运行的环境里,这是基础)。在php文件中将绘制图形的html文件include进来,接收html中Ajax传递到后台的信息,将base64转化为图片保存。

    先判断picInfo是否存在,存在则传递到后台,代码如下:

    if(picInfo){

      $.ajax({

        type: "post",

        data: {

          baseimg: picInfo

        },

        url: 'test.php?action=save',

        async: true,

        success: function(data) {

          console.log(picInfo);

        },

        error: function(err){

          console.log('图片保存失败');

          alert('图片保存失败');

        }

      });

    }

    test.php接收数据并处理:

    <?php

    include("test.html");

    if($action = "save"){

      $picInfo = $_POST['baseimg'];

      $streamFileRand = date('YmdHis').rand(1000,9999); //图片名

      $picType ='.png';//图片后缀

      $streamFilename = "/www/echarts/".$streamFileRand .$picType; //图片保存地址

      preg_match('/(?<=base64,)[\S|\s]+/',$picInfo,$picInfoW);//处理base64文本

      file_put_contents($streamFilename,base64_decode($picInfoW[0]));//文件写入

    }

    OK,成功保存图片到自己想要的位置。还有一点,如果你在测试的时候用了getDataURL方法,看到一个空的坐标轴,那么可能是动画效果产生的后果,animation决定是否开启动画,关闭即可,在option中加入:

    animation : false,

    好啦,得到的图形可以正确显示啦。祝大家好运,不要遇到各种棘手的问题。

    相关文章

      网友评论

      • 05e28f9743b6:您好,请问下,因为需求中有多个表格,这个saveAsImage 可以自动出发保存吗,或者是点一下保存 就把所有图片存起来了?
        呆呆的木木:@莉莉安_bed3 你好,saveAsImage 需要点击图片上面的↓才可以保存。第三种方法才是最终自动保存的方法
        05e28f9743b6:@呆呆的木木 您好,试了下,导出的图片背景全是黑色.... 您遇到过这种情况吗,百度了 没找到具体原因
        呆呆的木木:@莉莉安_bed3 试一下花不了多长时间的。尝试一下就知道了。
      • aaade0517e37:手机中不支持saveAsImage,不能保存为图片,怎么解决呐
      • sapyls:请问ie8 如何实现echarts图片的导出 ie8下getDataUrl不支持
        35704a00fc83:我也有同样的问题,ie8下不能将echars图片导出:disappointed_relieved:
        呆呆的木木:或许...换个浏览器.....
      • wuliJJ:刚开始图片是空轴,animation : false,之后是好使的,但是动画效果也是需要的
        呆呆的木木:@wuliJJ 你好,我只是找资料解决了我的问题,然后分享出来。。你这种情况没有深入研究,抱歉
        hel2o:这种是得在浏览器中访问你的地址然后在后台生成图片
        有没有一种办法能直接在后台生成
        wuliJJ:这怎么解决
      • eb28a76783b9:哇喔,这篇文章帮到我了耶
      • 9988909201ef:写的很不错,赞赞赞

      本文标题:ECharts绘制的图形保存为图片

      本文链接:https://www.haomeiwen.com/subject/qnuybttx.html