解决在页面中无法获取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>


目录
相关文章
|
9天前
|
编解码 前端开发 JavaScript
js react antd 实现页面低分变率和高分变率下字体大小自适用,主要是配置antd
在React中结合Ant Design与媒体查询,通过less变量和响应式断点动态调整`@font-size-base`,实现多分辨率下字体自适应,提升跨设备体验。
31 2
|
4月前
|
前端开发 JavaScript 容器
制作b超单生成器, 假怀孕b超单图片制作, p图医院证明【css+html+js装逼恶搞神器】
本资源提供一个适合用于熟人之间恶搞的工具,效果逼真,仅供学习参考与娱乐。包含前端技术学习要点:语义化布局、响应式设计、Flexbox、图片自适应
|
11月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
217 1
|
8月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
237 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
9月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
346 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
8月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
200 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
9月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
203 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
7月前
|
JavaScript 前端开发 API
纯js轻量级页面顶部Loading进度条插件
纯js轻量级页面顶部Loading进度条插件
|
9月前
|
移动开发 JavaScript 前端开发
【Html.js——图片折叠效果】折叠手风琴(蓝桥杯真题-1763)【合集】
本项目实现了一个图片折叠手风琴效果,使用jQuery完成。主要包括以下部分: - **介绍**:任务是通过点击图片实现折叠和展开的效果。 - **准备**:内置初始代码,包含 `css/style.css`、`images/` 文件夹、`js/` 文件夹及 `index.html` 等文件。启动 Web Server 服务可运行项目。 - **目标**:完善 `index.js` 文件,使页面达到预期的折叠效果。 - **规定**:严格按步骤操作,保持默认文件结构不变,并在完成后保持 Web 服务正常访问状态。 - **通关代码**:使用 jQuery 实现点击事件,为选中元素添加 `act
122 19
|
10月前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件

热门文章

最新文章