解决qrcode生成的二维码华为手机长按不识别、toDataURL之后中间logo丢失等问题

问题描述

qrcode生成的二维码,在苹果等手机上长按可识别,在华为手机上长按没有反应,截图保存下来长按又可以识别。

问题原因

浏览器兼容问题
qrcode在页面生成二维码时,会生成一个canvas标签和一个img标签。在电脑浏览器上调试的时候,发现生成二维码之后canvas标签是会自动隐藏的,然后展示img标签,我们看到和识别的其实是图片。但是在华为手机上生成的canvas是不会隐藏的,我们看到的是canvas,所以无法识别,截图却可以。

解决办法

手动将canvas隐藏,获取生成的链接拼到图片里面。
html页面:

<!--用于存放canvas,隐藏-->
<div id="QRCodeNone" style="width:54%;height:200px;margin:8% 0 8% 23%;display:none;"></div>
<!--用于存放二维码中间logo图片-->
<img id="qrCodeIco" src="cicLogo.png" style="display:none;"/>
<!--用于存放二维码图片-->
<div id="QRCode" style="width:54%;height:200px;margin:8% 0 8% 23%;"></div>

js:

  function makeQRCode() {
        var width = 200,height = 200;     
        var shareUrl = "分享出去的链接" 
		var x = width * 0.4,
		    y = height * 0.4,
		    lx = width * 0.2, 
		    ly = height * 0.2;   
		$("#QRCode").qrcode({
			render: "canvas",
			text: shareUrl,
			width : width,               //二维码的宽度
			height : height,              //二维码的高度
			background : "#ffffff",       //二维码的后景色
			foreground : "#3498db"        //二维码的前景色
			//src: "logo"
		});
        //在小米或者华为手机上生成的二维码是通过canvas展示的,img标签被隐藏,所以需要特殊处理一下,将canvas标签隐藏,拿到生成的url放到img里面再展示出来
        var myCanvas = document.getElementsByTagName('canvas')[0];
        //添加logo,qrcode中src方式带的logo因为跨域等问题,在toDataURL会丢失,这儿手动绘制一个
		myCanvas.getContext('2d').drawImage($("#qrCodeIco")[0], x, y, lx, ly);
        var img = convertCanvasToImage(myCanvas);
        $("#QRCode").append(img);
    };
    //将canvas返回的图片添加到image里
    function convertCanvasToImage(canvas){
    	var image = new Image();
    	image.src = canvas.toDataURL("image/png");
    	return image;
    }

toDataURL语法

canvas.toDataURL(type, encoderOptions);
返回一个包含图片展示的 data URI
参数
type 可选
图片格式,默认为image/png
encoderOptions 可选
图片质量。取值范围为0到1。如果指定图片格式为image/jpeg或image/webp。如果超出取值范围,将会使用默认值0.92。其他参数会被忽略。

返回值
包含dataURI的DOMString。
DataURI格式:data:[][;base64],。其中mediatype声明了文件类型,遵循MIME规则,如“image/png”、“text/plain”;之后是编码类型,这里我们只涉及 base64;紧接着就是文件编码后的内容了。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值