1. 程式人生 > >htmlcanvas2實現將網頁生成圖片,自定義儲存圖片的名稱

htmlcanvas2實現將網頁生成圖片,自定義儲存圖片的名稱

首先熟悉htmlcanvas2的使用方法,看看github的使用說明

        html2canvas(document.body).then(function(canvas) {
            document.body.appendChild(canvas);
        });

這是我要擷取的網頁的html效果圖


使用htmlcanvas2需要注意一下幾個坑(這都是我一個一個踩過的奮鬥):

1 如果你擷取的網頁中有圖片和文字,在本地測試時生成圖片時,網頁中的圖片截取出來竟然是空白?

(心裡在想:什麼狗屁外掛根本不管用 圖片都擷取不了偷笑

原因:程式必須放在伺服器下執行,不然的話網頁中的圖片是出不來的

2 把程式放在伺服器上運行了,發現圖片還是出不來,有圖片的地方還是一片空白?生成的圖片效果是這樣的


為什麼一個二維碼圖片可以出來,另一個二維碼圖片沒有出來?這就要從二維碼身上找原因了

我的二維碼的生成用到了這個外掛jquery.qrcode-logo.js,呼叫方法如下:

$("#code").qrcode({ 
	render : "canvas",
	text: pay_url,
	width:312,
	height:312,
	src: 'http://css.zzebz.com/images/kkbl.jpg'
});

發現兩個二維碼的呼叫區別是多了一個  src: 'http://css.zzebz.com/css//images/kkbl.jpg' 就是二維碼中間的logo小圖片,這個依然是圖片的跨域問題,所以我們一定要避免擷取的網頁中的圖片跨域問題!把這個路徑換成本地路徑 src: '__STATIC__/images/kkbl.jpg';

這裡還會存在一個問題,在jquery.qrcode-logo的二維碼沒有生成之前htmlcanvas已經開始生成圖片了,這樣生成的圖片中的二維碼是空白,

所以htmlcanvas2的執行要延遲1s。現在生成圖片之後是可以手動 右鍵滑鼠 將圖片另存為 儲存圖片的。這樣截圖就OK了,程式碼如下:

	setTimeout(function(){
		html2canvas($("#view"), {
			onrendered: function(canvas) {
				$("#qrbox").append(canvas);
			}
		});
	},1000);
如果我想在儲存圖片的時候可以自定義圖片的名稱
該如何做?我從網上搜到一段程式碼如下:
		var type = 'png';
		var imgData = canvas.toDataURL(type);
		var _fixType = function(type) {
			type = type.toLowerCase().replace(/jpg/i, 'jpeg');
			var r = type.match(/png|jpeg|bmp|gif/)[0];
			return 'image/' + r;
		};
		imgData = imgData.replace(_fixType(type),'image/octet-stream');
		var saveFile = function(data, filename){
			var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
			save_link.href = data;
			save_link.download = filename;
		
			var event = document.createEvent('MouseEvents');
			event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
			save_link.dispatchEvent(event);
		};
		var filename = shopname + '.' + type;
		saveFile(imgData,filename);

html2canvas2生成的圖片是一個大的canvas,只有獲取到了這個canvas才可以自定義儲存圖片的名稱,

這裡的關鍵在於如何獲取到這個canvas,這個canvas上並沒有id 什麼都沒有

首先想到的通過id="qrbox"獲取裡邊的子元素

var can = document.getElementById("qrcode").getElementsByTagName("canvas")[0];
console.log(can);結果:<canvas width="120" height="120"></canvas>

得到的canvas是這樣的 寬高是120的canvas,這個canvas竟然不是那張大圖片的canvas,而是右下角jquery.qrcode-logo生成的那張二維碼?這裡非常的怪異!

嘗試著獲取#qrcode的第一個子元素第二個子元素,全部是undefined,通過qrbox中的子元素來獲取這個大的canvas失敗了!!

所以我就想到如何為htmlcanvas2生成的這個大的canvas增加一個id,這樣就要修改htmlcanvas2原始碼了

原始碼三千多行,其實我的內心是崩潰的哭,多半這個id是不好加上的

我在想既然htmlcanvas2繪製出了這個大的canvas,那我就去找原始碼中繪製canvas的程式碼createElement("canvas"),繪製的時候就手動增加id,就這樣一個一個的打出來試試

第一處:
var croppedCanvas = document.createElement("canvas");
croppedCanvas.setAttribute("id","myCanvas");
console.log(croppedCanvas);
第二處:
this.canvas = this.options.canvas || this.document.createElement("canvas");
this.canvas.setAttribute("id","myCanvas");
console.log(this.canvas);
第三處:
var ctx, canvas = document.createElement('canvas');
canvas.setAttribute("id","myCanvas");canvas.setAttribute("id","myCanvas");console.log(canvas);
canvas.width = size.width;
canvas.height = size.height; 
...................就不一一列出了

令我驚喜的是,終於得到了我想要的id,現在就可以用id來找到這個canvas了,結合我的專案修改之後自定義儲存圖片名稱的完整程式碼如下:

var shopname = "糖貓貓的店鋪";
var c = document.getElementById("myCanvas");console.log(c);
document.getElementById("btnsave").addEventListener("click",function(){
	if(c==null){
		alert("獲取資料失敗,請重新整理頁面!");
		return false;
	}
	var type = 'png';
	var imgData = c.toDataURL(type);
	var _fixType = function(type) {
		type = type.toLowerCase().replace(/jpg/i, 'jpeg');
		var r = type.match(/png|jpeg|bmp|gif/)[0];
		return 'image/' + r;
	};
	imgData = imgData.replace(_fixType(type),'image/octet-stream');
	var saveFile = function(data, filename){
		var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
		save_link.href = data;
		save_link.download = filename;
	
		var event = document.createEvent('MouseEvents');
		event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
		save_link.dispatchEvent(event);
	};
	var filename = shopname + '.' + type;
	saveFile(imgData,filename);
});

這是什麼編輯器真的不好用,編輯出來的都是什麼格式!重新弄了無數次!!!