解决在页面中无法获取qrcode.js生成的base64的图片

简介: 该文档介绍了如何解决在部分安卓手机上无法正确加载二维码图片的问题。之前的方法是使用qrcode.js生成二维码,然后与背景图结合用canvas绘制海报,但在某些安卓设备上遇到onload事件不触发的问题。

应用场景


生成带二维码的推广海报图片


旧方法


将用户自己的推广连接先通过qrcode.js生成二维码,然后再用后台返回的一张背景图片和二维码通过canvas绘制成一张海报。


问题


在部分安卓手机上获取二维码图片后,onload事件不起作用,代码演示如下。

<!---放二维码--->
<div id="imgs" style="width:100px; height:100px; margin-top:15px;"hidden></div>
<!-- 生成canvas海报 -->
<canvas id="myCanvas" width="" height=""></canvas>
<!-- 生成canvas海报 -->
<!--海报弹窗-->
<div class="shadow" onclick="shareHide()"></div>
<img  class="shareImg" id="imgShow" src="">
<script type="text/javascript">
    document.onreadystatechange = loadingChange;  // 当页面加载状态改变的时候执行这个方法.  
    function loadingChange()   
    {     
          if(document.readyState == "Loading") {    // 当页面加载状态为完全结束时进入 
            // $(".shodowS").show() 
          }
          if(document.readyState == "complete") {   // 当页面加载状态为完全结束时进入 
        var qrcodes = new QRCode(document.getElementById("imgs"), {
          width : 160,
          height : 160
        });
        qrcodes.makeCode('{$url}');        // 生成二维码
        shareImgs();
          }
      }
  
    var canvas = document.getElementById('myCanvas');
  canvas.width=$("#container").width()*2;
  canvas.height=$("#container").width()*1440/1080*2;
  $("#myCanvas").css("width",$("#container").width());
  $("#myCanvas").css("height",$("#container").width()*1440/1080);
  // 分享图片生成的
  function shareImgs() {
    var qrcode=document.getElementById("imgss");
    if (canvas.getContext) {
      var ctx = canvas.getContext('2d');
      //创建新的图片对象
      var img = document.getElementById("imgs1");
      var img = new Image;
      
      //指定图片的URL
      // img.crossOrigin="anonymous";         // 这个可以对苹果手机做兼容(跨域)
      // img.src=img.src;
      img.src='{$bg[0]}';
      img.onload = function() {
        var imgOw=img.width,imgOh=img.height;
        var imgW=canvas.width,imgH=(imgOh*canvas.width)/imgOw;
        var imgX=0,imgY=0;
        //以Canvas画布上的坐标(10,10)为起始点,绘制图像
        ctx.drawImage(img, imgX, imgY,imgW,imgH);     
        var qrcodeX, qrcodeY,qrcodeW,qrcodeH;
        qrcode.crossOrigin="anonymous";
        qrcode.src=qrcode.src;
        qrcode.onload = function() {
          //以Canvas画布上的坐标(10,10)为起始点,绘制图像
          ctx.drawImage(qrcode,846/1080*canvas.width, 1220/1440*(imgOh*canvas.width)/imgOw+(canvas.height-imgH)/2, 160/1440*img.width, 160/1440*img.width); 
          var _imgSrc = canvas.toDataURL("image/png",1);
             var imgShow = document.getElementById('imgShow');
                 imgShow.setAttribute('src', _imgSrc);
        }   
      }
    }
  }
       
</script>


解决方法


虽然知道是页面渲染的先后问题,但是时间很紧,只能跳过使用另一种方式解决这种在有的手机上不能生成海报的问题。所以决定通过后台生成二维码放在页面,然后JS只需要获取后台返回的base64二维码和海报绘制再生成图片,最后安卓苹果手机都能显示了。


1. 使用的是phpqrcode类,不过需要简单的修改一下,让其能生成base64的二维码,这个我是在网上参考别人的源码,具体是谁忘记了,记起后代码原著我会补上,这里就代码先上了。


2.  PHP后台生成并返回

/*生成二维码**/
      //打开缓冲区
      ob_start();
      //生成二维码图片
      $returnData = QRcode::pngString($url,false, "H", 3, 1);
      //这里就是把生成的图片流从缓冲区保存到内存对象上,使用base64_encode变成编码字符串,通过json返回给页面。
      $imageString = base64_encode(ob_get_contents());
      //关闭缓冲区
      ob_end_clean();
      $shareQrcode = "data:image/png;base64,".$imageString;
    /**生成二维码*/


3. 前端显示二维码,并js获取重新绘制

<!-- 二维码图片 -->
<img src="{$bg[0]}" hidden="hidden" id="imgs1">
<!--PHP生成的二维码-->
<img src="{$shareQrcode}" hidden="hidden" id="phpQrcodeImg">
<script type="text/javascript">
  var canvas = document.getElementById('myCanvas');
  canvas.width=$("#container").width()*2;
  canvas.height=$("#container").width()*1440/1080*2;
  $("#myCanvas").css("width",$("#container").width());
  $("#myCanvas").css("height",$("#container").width()*1440/1080);
  // 分享图片生成的
  function shareImgs() {
    var qrcode=document.getElementById("imgss");
    var testQrcode = document.getElementById("phpQrcodeImg");
    
    if (canvas.getContext) {
      var ctx = canvas.getContext('2d');
      //创建新的图片对象
      var img = document.getElementById("imgs1");
      var img = new Image;
      
      img.src='{$bg[0]}';
      img.onload = function() {
        var imgOw=img.width,imgOh=img.height;
        var imgW=canvas.width,imgH=(imgOh*canvas.width)/imgOw;
        var imgX=0,imgY=0;
        //以Canvas画布上的坐标(10,10)为起始点,绘制图像
        ctx.drawImage(img, imgX, imgY,imgW,imgH);     
        
        // js生成二维码在部分安卓机上无法获取到二维码图片资源最后onload不到
        var qrcodeX, qrcodeY,qrcodeW,qrcodeH;
        qrcode.crossOrigin="anonymous";
        qrcode.src=qrcode.src;
        
        // 修改为PHP生成的二维码
        testQrcode.crossOrigin="anonymous";
        testQrcode.src = testQrcode.src;
        
        testQrcode.onload = function() {
          //以Canvas画布上的坐标(10,10)为起始点,绘制图像
          ctx.drawImage(testQrcode,846/1080*canvas.width, 1220/1440*(imgOh*canvas.width)/imgOw+(canvas.height-imgH)/2, 160/1440*img.width, 160/1440*img.width); 
          var _imgSrc = canvas.toDataURL("image/png",1);
              // canvas.style.display="none";
             var imgShow = document.getElementById('imgShow');
                 imgShow.setAttribute('src', _imgSrc);
        }   
      }
    }
  }
</script>


目录
相关文章
|
15天前
|
监控 JavaScript 前端开发
使用Vue.js开发员工上网行为监控的实时数据展示页面
使用Vue.js开发的实时员工上网行为监控页面,展示员工访问的网站、应用和时间等数据。页面响应式设计,适应不同设备。通过Vue组件显示实时数据,如`&lt;li v-for=&quot;activity in activities&quot;&gt;`循环渲染。数据定时更新,利用Vue的生命周期钩子和axios从服务器获取并自动刷新,确保数据的时效性。该页面有助于管理者即时了解员工网络活动,保障企业网络安全和资源管理。
72 5
|
8天前
|
前端开发 JavaScript
杨老师课堂之JavaScript案例手动切换轮播图片
杨老师课堂之JavaScript案例手动切换轮播图片
11 2
|
8天前
|
前端开发 JavaScript
杨老师课堂之JavaScript案例之自动切换轮播图片
杨老师课堂之JavaScript案例之自动切换轮播图片
11 1
|
11天前
|
Web App开发 JavaScript 前端开发
使用 JS 实现在浏览器控制台打印图片 console.image()
在前端开发过程中,调试的时候,我们会使用 console.log 等方式查看数据。但对于图片来说,仅靠展示的数据与结构,是无法想象出图片最终呈现的样子的。 虽然我们可以把图片数据通过 img 标签展示到页面上,或将图片下载下来进行预览。但这样的调试过程实在是复杂,何不实现一个 console.image() 呢?
20 1
使用 JS 实现在浏览器控制台打印图片 console.image()
|
4天前
|
缓存 JavaScript 前端开发
js刷新当前页面
js刷新当前页面
|
8天前
|
前端开发 JavaScript
杨校老师课堂之JavaScript案例之跑马灯左右无缝连接图片自动轮播
杨校老师课堂之JavaScript案例之跑马灯左右无缝连接图片自动轮播
9 2
|
11天前
|
JavaScript 前端开发
页面加载时执行特定的 JavaScript 代码
页面加载时执行特定的 JavaScript 代码
|
16小时前
|
移动开发 JavaScript 前端开发
rem的适配方案,css文件和js文件的引入方式,特色小边框的制作,DS-Digital.ttf数字展示屏的使用方法:,自适应图片 background-size,jQuery爆bug,a和盒子居中,
rem的适配方案,css文件和js文件的引入方式,特色小边框的制作,DS-Digital.ttf数字展示屏的使用方法:,自适应图片 background-size,jQuery爆bug,a和盒子居中,
|
19小时前
|
缓存 JavaScript 前端开发
老程序员分享:js刷新页面得重新加载和页面的刷新
老程序员分享:js刷新页面得重新加载和页面的刷新
|
20小时前
|
数据采集 Web App开发 XML
详尽分享用Node.js写爬虫,撸羞羞的图片
详尽分享用Node.js写爬虫,撸羞羞的图片