SVG轉Canvas並添加背景圖片進行上傳

SVG是什麼

SVG是很早之前就出來的通過xml格式來定義並渲染矢量圖片的一種方式,因爲是類似Dom節點的格式,所以xml節點可以像Dom一樣,可以通過js或者jQuery直接獲取並修改。好處就是因爲是矢量圖,所以放大縮小不失真,一般地圖開發中使用最多。

Canvas是什麼

Canvas就是一張畫布,只有width,height,id這3個屬性,其他只能通過js來改變,通過調用js api來畫圖,這是H5發佈後新增的。

SVG圖片上傳

一般svg繪製的圖片直接上傳不了,要轉換到base64數據才能上傳.
網上很多介紹canvg.js來進行svg轉變成canvas,然後canvas通過toDataURL再轉變成blob進行上傳的,如果沒有背景圖片需求,這樣是完全沒問題的,但是如果canvas需求背景圖片的話,因爲toDataURL方法不認爲canvas的css屬性background-image是數據內容的一部分,所以toDataURL轉換後的blob信息沒有背景圖片,不是黑的就是白的。

Canvas帶背景圖片上傳

toDataURL信息想要帶背景圖片的話,一定要使用drawImage來進行繪畫,所以canvas想要帶背景圖片的,可以使用drawImage來先繪製背景圖片,然後在繪製其他圖片內容。

SVG帶背景圖片上傳

所以svg想要帶背景圖片上傳的話,就可以利用drawImage重載方法支持image,canvas來通過2個canvas來實現, canvas1先畫背景圖片,canvas2是通過canvg.js轉換svg來得到的,這樣以後,canvas1再繼續繪製canvas2。最後canvas轉blob進行圖片上傳,這樣就可以實現svg帶背景圖片上傳了。

參考代碼如下:

	var image_url = 'http://xxxxxxx/image/xxxx/test.jpg';
	var svgXml = $('#svg_container').html(); //獲取svg標籤字符串內容

	var bg_image = new Image(); //先畫原來圖片當作背景
	bg_image.src =  image_url;	//可以使用onload

	var canvas = document.createElement('canvas');
	canvas.width = $('#svg_container svg').width();
	canvas.height = $('#svg_container svg').height();
	var context = canvas.getContext('2d');  //取得畫布的2d繪圖上下文
	context.drawImage(bg_image, 0, 0);

	var canvassvg = document.createElement('canvas');
	canvassvg.width = $('#svg_container svg').width();
	canvassvg.height = $('#svg_container svg').height();
	canvassvg.id = 'canvassvg';
	canvg(canvassvg,svgXml);

	context.drawImage(canvassvg, 0, 0);

	var suffix = image_url.substring(image_url.lastIndexOf(".")+1).toLowerCase();
	var filename = image_url.substring(image_url.lastIndexOf("/")+1);
	var image_type = "image/png";
	if(suffix == 'jpg' || suffix == 'jpeg'){
		image_type = "image/jpeg";
	}else{
	}
	var dataURL = canvas.toDataURL(image_type);
	var blobBin = atob(dataURL.split(',')[1]);
	var array = [];
	for(var i = 0; i < blobBin.length; i++) {
	    array.push(blobBin.charCodeAt(i));
	}
	var file=new Blob([new Uint8Array(array)], {type: image_type});
	var generatedFile = new File([file], filename, {type: image_type});

	var params = {
		'up' : generatedFile
	}
	fileUploadXhr({
		url: '/xxx/xxxx'
		, type: 'POST'
		, cache: false
		, dataType : 'json'
		, resetForm : true
		, clearForm : true
		, includeHidden : false
		, success : function() {

		}
		, error : function() {

		}
	}, params);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章