首先附上html2canvas的CDN地址:http://www.bootcdn.cn/html2canvas/ ;html
此方法可截取整個div的內容,包括不可視區域,而且能夠實現跨域圖片截圖。以前看了不少關於html2canvas插件圖片跨域的解決辦法,大部分的答覆是在服務器端配置,以後將useCORS屬性設置爲true,可是若是圖片是保存在別人家的服務器上好比阿里雲的oss上,那這個方法就實現不了了。哦多卡幾,那就把圖片轉成base64編碼賦給img的src,再去截圖,這樣截圖時就避開了跨域請求。完整代碼以下:web
<div class="box">
<p>這是生成圖片的box,內容不限</p>
//跨域圖片(oss地址)
<img id="ossImg" src="https://devimg.xiezixiansheng.com/users/0/1/photo/20160708035328.jpeg">
</div>
下面是js代碼:canvas
var c_width = $('.box').outerWidth();//若是box設置了padding,須要獲取outerWidth和outerHeight來賦給canvas; var c_height =$('.box').outerHeight(); var canvas = document.createElement("canvas"); var context = canvas.getContext("2d"); //如下代碼是獲取根據屏幕分辨率,來設置canvas的寬高以得到高清圖片 // 屏幕的設備像素比 var devicePixelRatio = window.devicePixelRatio || 2; // 瀏覽器在渲染canvas以前存儲畫布信息的像素比 var backingStoreRatio = context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; // canvas的實際渲染倍率 var ratio = devicePixelRatio/backingStoreRatio; canvas.width = c_width * ratio; canvas.height = c_height * ratio; canvas.style.width = c_width + "px"; canvas.style.height = c_height + "px"; var transTop = $(document).scrollTop() - $('.card_box').offset().top;//獲取div垂直方向的位置 context.scale(ratio,ratio); context.translate((c_width-$(window).width())/2,transTop) //canvas的位置要保證與div位置相同。
//高清圖設置完成
//解決跨域,將跨域圖片路徑轉爲base64格式
var img = new Image();
var canvas2 = document.createElement('canvas');
var ctx = canvas2.getContext('2d');
img.crossOrigin = 'Anonymous';
img.src=$('#ossImg').attr('src);
img.onload = function () {
canvas2.height = img.height;
canvas2.width = img.width;
ctx.drawImage(img, 0, 0);
var dataURL = canvas2.toDataURL('image/png');
$('#ossImg').attr('src',dataURL);
canvas2 = null;
//從新給img賦值成功後,執行截圖方法
getCard()
}
function getCard(){
html2canvas($(".box"),{ allowTaint:true, useCORS:true, canvas:canvas, onrendered:function(canvas){ dataURL =canvas.toDataURL("image/png"); var img = new Image(); img.src=dataURL; img.className = 'cardImg'; img.onload = function () { $(".card").append(img); } }, width:c_width, height:c_height })
}
注意!!!若是須要生成圖片的div有背景圖,須要將背景圖以img標籤訂位顯示,若直接給div設置background會致使生成的圖片 背景圖模糊。附上親身經驗的圖片(最下方的二維碼及文字與底層大背景是一體):vim
圖1是div設置background的圖片效果,圖2是div用img標籤展現的效果:跨域
我又來補充了:採坑過程有點艱難,最近作的活動又有這個截圖的功能,活動界面比較炫酷 各類顏色各類漸變發光效果。而後截圖就致使了比其餘普通圖片圖片大不少,base64編碼是會阻塞瀏覽器渲染的,當編碼過長會形成瀏覽器卡頓,蘋果手機影響不大,安卓機特別是華爲手機上,滑動卡頓明顯,且在QQ裏出現閃退。因此,若是須要截的圖很大的話,仍是建議與服務器端配合。瀏覽器