canvas画图失败之图片跨域问题

186 阅读1分钟

canvas画图失败之图片跨域问题

Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. at img.onload (eval at window.getCodeValue (webpack:///./base/magicBase.js?), :18:20)

image.png

  • 错误示意:canvas无法执行toDataURL方法:画布被污染,无法输出:

受限于 CORS 策略,图片可能会存在跨域问题,虽然可以使用图像,但是绘制到画布上会污染画布,一旦一个画布被污染,就无法提取画布的数据,比如无法使用画布toBlob(),toDataURL(),或getImageData()方法;当使用这些方法的时候会抛出一个安全错误

  • 解决方法:

给图片设置crossOrigin属性,代码为:img.setAttribute("crossOrigin",'Anonymous')

    //将图片转为base64格式
    function(formData){
	var logoUrl = formData.logoUrl;
	var canvas = document.createElement("canvas");
	var ctx = canvas.getContext("2d");
	var base64 = '';
	var img = new Image();   
	img.src = logoUrl;
        //解决图片跨域问题
	img.setAttribute("crossOrigin",'Anonymous')
        //图片加载完后再进行canvas绘图
	img.onload = function(){
		var width = img.width;
                var height = img.height;
		canvas.width = width;
                canvas.height = height;
                //设置绘图背景色
		ctx.fillStyle = 'rgba(255,255,255,0)';
		ctx.fillRect(0, 0, canvas.width, canvas.height);
		ctx.drawImage(img, 0, 0, width, height);
		base64 = canvas.toDataURL("image/jpeg");
		canvas.width = canvas.height = 0;
	}
   }