【2024】qrcode生成二维码并下载【带logo图标】【带文字形貌】 ...

打印 上一主题 下一主题

主题 980|帖子 980|积分 2940

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
需求:将固定网址(公司主页、博客主页……)生成二维码。
  

  • 【加上公司logo、博客头像(位置居中)】
  • 【加上公司名、博客名(名称不要太长)】(最后没加,有些公司名太长了不好看)
  • 【二维码边上要一点留白,好看一点】
  • 【留白的最外面最好加上一个很细的边框,放在白色背景里面不会突兀】
  • 【最后必要转换成图片格式,canvas在有些手机上长按是无法识别跳转的,只有图片格式的全部手机都能长按识别跳转】
  • 【二维码可以下载到本地】
    效果图:
  不带文字
  

  带文字
  

    qrcode官网地址:http://jeromeetienne.github.io/jquery-qrcode/
  canvas学习: 学习 HTML5 Canvas 这一篇文章就够了 | 菜鸟教程
  canvas学习:HTML 画布_w3cschool
    遇到问题:
  1、中文乱码:必要先将中文字体转码。
  2、qrcode.js生成的二维码是最简单的一个二维码,没有任何样式。
      必要给canvas绘制白色边框、添加灰色线框、添加文字、绘制logo
  3、将页面上的canvas更换为img图片展示(在手机上:长按知识二维码必要图片格式才能识别)。
  4、将生成的二维码图片下载到本地。
  html 
  1. <!--到官网去下载-->
  2. <script src="js/jquery.js"></script>
  3. <script src="js/qrcode.min.js"></script>
  4. ……
  5. <a ng-click="saveImageQrcode(vm.companyName)" title="点击下载公司二维码">
  6.   <div rwd-create-qrcode="{{vm.qrcodeUrl}}" qrcode-logo="{{vm.companyLogoUrl}}" qrcode-size="90"></div>
  7.   <div class="small text-g text-center">[点击下载]</div>
  8. </a>
复制代码
 js
  1. // 二维码-白色边框大小
  2. var borderSize = 15; // 15px
  3. // 二维码宽高 【项目中只使用正方形的二维码,只需要一个数值就OK】
  4. var qrcodeWidth = parseInt(attrs.qrcodeSize) || 200;
  5. var qrcodeHeight = parseInt(attrs.qrcodeSize) || 200;
  6. var strText = toUtf8(attrs.rwdCreateQrcode);//中文格式转换
  7. var logoURl = attrs.qrcodeLogo;//二维码中间的logo图片url
  8. setTimeout(() => {
  9.   //生成二维码
  10.   element.qrcode({
  11.     text: strText, // 生成二维码的-链接或者文字
  12.     render: 'canvas', //设置渲染方式 table canvas
  13.     width: qrcodeWidth,// 二维码的宽度
  14.     height: qrcodeHeight,// 二维码的高度
  15.   });
  16.   var initialCanvas = element.find('canvas').get(0);
  17.   // 在初始的二维码上,绘制边框+logo ,以canvas的形式展示在页面上
  18.   // drawQrcode(initialCanvas, qrcodeWidth, qrcodeHeight, borderSize, logoURl);
  19.   // 在初始的二维码上,绘制边框+logo ,最终以图片的形式展示在页面上
  20.   drawQrcode(initialCanvas, qrcodeWidth, qrcodeHeight, borderSize, logoURl, function (canvas) {
  21.     // 将页面的canvas隐藏,创建img来展示二维码
  22.     element.find('canvas').hide(); //隐藏掉初始的canvas
  23.     var childImg=document.createElement('img');//创建img标签
  24.     element.append(childImg);// 添加img标签到当前元素下
  25.     element.find('img').attr('src', canvas.toDataURL('image/png')); // 将canvas转为图片数据,赋值给img标签
  26.   });
  27.   //调用保存二维码图片的函数
  28.   scope.saveImageQrcode = (fileName) => {
  29.     // 利用 a 标签的 download 属性去下载图片
  30.     let a = document.createElement('a');
  31.     a.download = `${fileName}-二维码.png`; // 设置下载文件的名称
  32.     a.href = initialCanvas.toDataURL('image/png');
  33.     // 创建一个点击事件
  34.     const clickEvent = new MouseEvent('click');
  35.     // 触发 a 标签的点击事件
  36.     a.dispatchEvent(clickEvent);
  37.   };
  38. }, 100);
复制代码
1、中文乱码:query-qrcode这个库是接纳 charCodeAt() 这个方式举行编码转换的,这个方法默认会获取它的 Unicode 编码,一般的解码器都是接纳UTF-8, ISO-8859-1等方式。英文是没有问题,如果是中文,一般环境下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。必要先将中文字体转码。
  1. function toUtf8(str) { //二维码编码前把字符串转换成UTF-8
  2.   var out, i, len, c;
  3.   out = '';
  4.   len = str.length;
  5.   for (i = 0; i < len; i++) {
  6.     c = str.charCodeAt(i);
  7.     if ((c >= 0x0001) && (c <= 0x007F)) {
  8.       out += str.charAt(i);
  9.     } else if (c > 0x07FF) {
  10.       out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
  11.       out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
  12.       out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
  13.     } else {
  14.       out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
  15.       out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
  16.     }
  17.   }
  18.   return out;
  19. }
复制代码
2、qrcode.js生成的二维码是最简单的一个二维码,没有任何样式。
      必要给canvas绘制白色边框、添加灰色线框、添加文字、绘制logo
  1.    /* 在初始的二维码上,绘制边框+logo+文字
  2.     * canvas:qrcodejs生成的二维码canvas
  3.     * qrcodeWidth:二维码的宽度
  4.     * qrcodeHeight:二维码的高度
  5.     * borderSize:二维码白边大小
  6.     * logoUrl:logo的url【有些二维码没有logo】
  7.     * callback:回调函数,返回生成的二维码图片的url
  8.     * **/
  9.     function drawQrcode(canvas, qrcodeWidth, qrcodeHeight, borderSize, logoUrl, callback) {
  10.       // logo宽高:是二维码的大小的1/4
  11.       let logoWidth = qrcodeWidth / 4;
  12.       let logoHeight = qrcodeHeight / 4;
  13.       //logo位置:位于二维码中间
  14.       let logoLeft = (qrcodeWidth - logoWidth) / 2 + borderSize;//logo距离左边的数值 = (二维码宽度 - logo宽度) / 2 + 白边宽度
  15.       let logoTop = (qrcodeHeight - logoHeight) / 2 + borderSize;//logo距离顶部的数值 = (二维码高度 - logo高度) / 2 + 白边宽度
  16.       const image = new Image();//二维码图片对象
  17.       const logoImage = new Image(logoWidth, logoHeight);//logo图片对象
  18.       // 解决跨域问题
  19.       image.setAttribute('crossOrigin', 'anonymous');
  20.       logoImage.setAttribute('crossOrigin', 'anonymous');
  21.       // 图片加载完成后,通过canvas处理
  22.       const context = canvas.getContext('2d');
  23.       // qrcodejs 生成的二维码加载完成后,开始 canvas 绘制
  24.       image.onload = function () {
  25.         // 通过canvas绘制,canvas的宽高设置为二维码图片宽高+白边宽度(上下borderSize)
  26.         canvas.width = qrcodeWidth + borderSize * 2;
  27.         canvas.height = qrcodeHeight + borderSize * 2;
  28.         ///
  29.         // 设置画布背景
  30.         context.fillStyle = '#ffffff';
  31.         // 带白色边框borderSize
  32.         context.fillRect(0, 0, canvas.width, canvas.height);
  33.         ///
  34.         // 给轮廓图形设置填充样式
  35.         context.strokeStyle = '#dddddd';
  36.         // 给轮廓矩形设置线宽
  37.         context.lineWidth = 2; //默认1px
  38.         // 绘制线框
  39.         context.strokeRect(0, 0, canvas.width, canvas.height);
  40.         ///
  41.         //添加文字的时候:需要设置 canvas.height = qrcodeHeight + borderSize * 2 + 10;(10px为文字的位置)
  42.         //text位置:位于二维码中间
  43.         // let textLeft = canvas.width / 2;//text距离左边的数值 = canvas的宽度 / 2
  44.         // let textTop = canvas.height - 10;//text距离顶部的数值 = canvas的宽度 - 底部留白的高度
  45.         // //设置文字样式
  46.         // context.fillStyle = '#000000';
  47.         // context.font = 'bold ' + 12 + 'px Arial';
  48.         // context.textAlign = 'center';
  49.         // //文字描述
  50.         // context.fillText('我的博客', textLeft, textTop);
  51.         ///
  52.         //绘制二维码
  53.         // padding:borderSize
  54.         context.drawImage(image, borderSize, borderSize); // 目标图像-二维码
  55.         ///
  56.         // 有logoURl,绘制logo;没有的时候直接返回最终canvas
  57.         if (logoUrl) {
  58.           // 中间的logo加载完成后,绘制logo
  59.           logoImage.onload = function () {
  60.             // 绘制logo图像,context.drawImage(logoImage,logoX, logoY, logoImage.width, logoImage.height);
  61.             context.drawImage(logoImage, logoLeft, logoTop, logoWidth, logoHeight);
  62.             // 将最终canvas传到回调函数中
  63.             callback && callback(canvas);
  64.           };
  65.           // 获取logoUrl,赋值给logoImage,触发logoImage的onload方法
  66.           logoImage.src = logoUrl;
  67.         } else {
  68.           // 将最终canvas传到回调函数中
  69.           callback && callback(canvas);
  70.         }
  71.       };
  72.       // canvas转为图片数据,赋值给image,触发image的onload方法
  73.       image.src = canvas.toDataURL('image/png');// 二维码图片
  74.     }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表