html2canvas将HTML内容写入Canvas生成图片

生而为人 谁不付出 谁不努力

html2canvas 能够实现在用户浏览器端直接对整个或部分页面进行截屏。这个html2canvas脚本将当页面渲染成一个Canvas图片,通过读取DOM并将不同的样式应用到这些元素上实现。·

它不需要来自服务器任何渲染,整张图片都是在客户端浏览器创建。当浏览器不支持Canvas时,将采用Flashcanvas或ExplorerCanvas技术代替实现。以下浏览器能够很好的支持该脚本:Firefox 3.5+, Google Chrome, Opera新的版本, IE9以上的浏览器。

参数名称 类型 默认值 描述
allowTaint boolean false Whether to allow cross-origin images to taint the canvas---允许跨域
background string #fff Canvas background color, if none is specified in DOM. Set undefined for transparent---canvas的背景颜色,如果没有设定默认透明
height number null Define the heigt of the canvas in pixels. If null, renders with full height of the window.---canvas高度设定
letterRendering boolean false Whether to render each letter seperately. Necessary if letter-spacing is used.---在设置了字间距的时候有用
logging boolean false Whether to log events in the console.---在console.log()中输出信息
proxy string undefined Url to the proxy which is to be used for loading cross-origin images. If left empty, cross-origin images won't be loaded.---代理地址
taintTest boolean true Whether to test each image if it taints the canvas before drawing them---是否在渲染前测试图片
timeout number 0 Timeout for loading images, in milliseconds. Setting it to 0 will result in no timeout.---图片加载延迟,默认延迟为0,单位毫秒
width number null Define the width of the canvas in pixels. If null, renders with full width of the window.---canvas宽度
useCORS boolean false Whether to attempt to load cross-origin images as CORS served, before reverting back to proxy--这个我也不知道是干嘛的

直接上实现代码

<!doctype html>
<html lang="en">
<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <title>指定区域生成图片</title>
  <script src="js/jquery-1.9.1.min.js"></script>
<script src="js/html2canvas.js"></script>
<script src="js/shareQrcode.js"></script>
<script src="js/canvas2image.js"></script>
<script src="layer/layer.js" type="text/javascript"></script>
</head>
<body class="bg-white">
<div class="modal-dialog dialog-result tqf" style="top:100%;" >
    <div class="content result-info">
	<!-- <img src="img/i-qq.png" /> -->
      <ul>
        <li class="title">测试结果</li>
        <li><b class="block jx_title">吉萨的粉红色的</b></li>
        <li class="title">测试说明</li>
        <li class="viewResult">是的发送到发送到否是的发送到发送到否是的发送到发送到否是的发送到发送到否</li>
      </ul>
    </div>
    <div class="code-bottom">
      <div class="fll" id="qrcode"></div>
      <h3 class="txt-overflow">几乎是大大</h3>
      <p><i class="icon icon-xs"></i>长按识别二维码快来测测吧</p>
      <p class="explain green">「心觉咨询」提供内容及技术支持</p>
    </div>
  </div>
  <footer class="no-border">
  <div class="btn-box tac">

    <a class="btn btn-radius btn-b-green btn-md" href="javascript:void(0)" οnclick="show('.dialog')">
	<i class="icon icon-download"></i>保存结果后分享</a>
  </div>
</footer><h1>图片生成位置</h1>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

<div class="modal-dialog dialog-result" id="share" style="display: none;">
 
        <li id="img" width="50%" ></li>
        <!--<img src="" width="100%" crossorigin="anonymous" id="img"/>-->
    
  </div>
</body>
</html>
/**
 * Created by Admin on 2018/11/12 0012.
 */

var times;
function show(obj) {
	layer.close(times);
	 times= layer.msg('海报生成中...', {
	  icon: 16,
	  shade: 0.2,
	  time: false
	});
    $(obj).toggle();
    saveShare();
}

function getBase64(imgUrl,imgId) {
	  window.URL = window.URL || window.webkitURL;
	  var xhr = new XMLHttpRequest();
	  xhr.open("get", imgUrl, true);
	  // 至关重要
	  xhr.responseType = "blob";
	  xhr.onload = function () {
	    if (this.status == 200) {
	      //得到一个blob对象
	      var blob = this.response;
	      console.log("blob", blob)
	      // 至关重要
	      let oFileReader = new FileReader();
	      oFileReader.onloadend = function (e) {
	        // 此处拿到的已经是 base64的图片了
	        let base64 = e.target.result;
	        console.log("方式一》》》》》》》》》", base64)
	        document.getElementById(imgId).src =  base64;
	      };
	      oFileReader.readAsDataURL(blob);
	      //====为了在页面显示图片,可以删除====
//	      var img = document.createElement("img");
//	      img.onload = function (e) {
//	        window.URL.revokeObjectURL(img.src); // 清除释放
//	      };
//	      let src = window.URL.createObjectURL(blob);
//	      img.src = src
	      //document.getElementById("container1").appendChild(img);
	      //====为了在页面显示图片,可以删除====

	    }
	  }
	  //xhr.send();
	}
function getImage (url,imgId) {
    var xhr = new XMLHttpRequest();
    xhr.open('get', url, true);
    xhr.responseType = 'blob';
    xhr.send();
    xhr.onload = function () {
        if (this.status == 200) {
            document.getElementById(imgId).src =  URL.createObjectURL(this.response);
        }
    };
}


function getPixelRatio(context){
	var backingStore = context.backingStorePixelRatio ||
                    context.webkitBackingStorePixelRatio ||
                    context.mozBackingStorePixelRatio ||
                    context.msBackingStorePixelRatio ||
                    context.oBackingStorePixelRatio ||
                    context.backingStorePixelRatio || 1;
            return (window.devicePixelRatio || 1) / backingStore;
}
function saveShare(){	       
            var shareContent = document.querySelector('.tqf');// 需要绘制的部分的 (原生)dom 对象 ,注意容器的宽度不要使用百分比,使用固定宽度,避免缩放问题
            var width = shareContent.offsetWidth;  // 获取(原生)dom 宽度
            var height = shareContent.offsetHeight; // 获取(原生)dom 高
            var offsetTop = shareContent.offsetTop;  //元素距离顶部的偏移量

            var canvas = document.createElement('canvas');  //创建canvas 对象
            var context = canvas.getContext('2d');
            var scaleBy = getPixelRatio(context);  //获取像素密度的方法 (也可以采用自定义缩放比例)
            canvas.width = width * scaleBy;   //这里 由于绘制的dom 为固定宽度,居中,所以没有偏移
           canvas.height = (height + offsetTop) * scaleBy;  // 注意高度问题,由于顶部有个距离所以要加上顶部的距离,解决图像高度偏移问题
            context.scale(scaleBy, scaleBy);

            var opts = {
            	userCORS:true,
                allowTaint:true,//允许加载跨域的图片
                tainttest:true, //检测每张图片都已经加载完成
                scale:scaleBy, // 添加的scale 参数
                canvas:canvas, //自定义 canvas
                logging: true, //日志开关,发布的时候记得改成false
                width:width, //dom 原始宽度
                height:height //dom 原始高度
            };
            html2canvas(shareContent, opts).then(function (canvas) {
            	 let img = new Image();
            	 img.crossOrigin = "Anonymous";
                 let base64ImgSrc = canvas.toDataURL("image/png");
                 img.src = base64ImgSrc 
                 img.onload = function(){                
                     $('#share').css('display','block').css("margin-top","-225px");
                     $('#img').html(img)  //  w 674  h 938
                     $('#img img').css("width","100%");
                     layer.close(times);
                 }
				
            });
}



发布了82 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tanqingfu1/article/details/104747303