canvas实现二维码和图片合成的示例代码


Posted in HTML / CSS onAugust 01, 2018

上个版本街道一个需求,使用url生成一个二维码,然后和另外一张图片合成一张图拍你,

实现思路是这样的

  1. 使用jr-qrcode将url生成data:base64供img使用
  2. 然后使用canvas 将两张图合成一张图片

遇到的问题

生成图片之后发现图片很模糊,解决办法是将canvas画布扩大两倍,其他参数也夸大两倍就可以了

jr-qrcode 可以使用npm install --save jr-qrcode 安装这个包

作用就是可以转化text到data:base64 供img的src 使用

代码如下

import React, { Component } from 'react'
const qrcode = require('jr-qrcode')
const loadImg = (src) => {
    const paths = Array.isArray(src) ? src : [src];
    const promise = [];
    paths.forEach((path) => {
        promise.push(new Promise((resolve, reject) => {
            let img = new Image();
            img.crossOrigin = "Anonymous";
            img.src = path;
            img.onload = () => {
                resolve(img);
            };
            img.onerror = (err) => {
                console.log('图片加载失败')
            }
        }))
    });
    return Promise.all(promise);

}
const getImageData = (url, src) => {
    const imgsrc = qrcode.getQrBase64(url)
    let canvas = document.createElement('canvas')
    const width = document.documentElement.clientWidth
    const height = document.documentElement.clientHeight
    canvas.width = width*2
    canvas.height = height*2
    let ctx = canvas.getContext("2d")
     loadImg([imgsrc, src]).then(([img1, img2]) => {
        ctx.drawImage(img2, 0, 0, width*2, height*2)
        ctx.drawImage(img1, width-80, height*2-220, 200, 160)
        ctx.fillStyle = 'rgba(0,0,0,0.3)';
        ctx.fillRect(width-80, height*2-60, 200, 40);
        ctx.save()
        ctx.font="28px Arial"
        ctx.fillStyle = '#fff';
        ctx.fillText('长按识别二维码', width-80, height*2-30, 200, 160)
        let imageURL = canvas.toDataURL("image/png")
        document.getElementById('mix_img').setAttribute('src',imageURL)
    })
}
export default class QRcode extends Component {
    render() {
        const { url , picSrc} = this.props
        getImageData(url,picSrc)
        return (
            <div>
                <img  alt='mix_img' id='mix_img'/>
            </div>
        )
    }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
用CSS禁用输入法(CSS3 UI规范)实例解析
Dec 04 HTML / CSS
css3气泡 css3关键帧动画创建的动态通知气泡
Feb 26 HTML / CSS
css3实现的下拉菜单效果示例
Jan 22 HTML / CSS
CSS3中background-clip和background-origin的区别示例介绍
Mar 10 HTML / CSS
利用 CSS3 实现的无缝轮播功能代码
Sep 25 HTML / CSS
CSS3 分类菜单效果
May 27 HTML / CSS
HTML5 拖拽批量上传文件的示例代码
Mar 28 HTML / CSS
分享一个H5原生form表单的checkbox特效代码
Feb 26 HTML / CSS
HTML5几个设计和修改的页面范例分享
Sep 29 HTML / CSS
html5 figure和figcaption的使用方法
Sep 10 HTML / CSS
Canvas系列之滤镜效果
Feb 12 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
Aug 11 HTML / CSS
HTML5拖拽功能实现的拼图游戏
Jul 31 #HTML / CSS
Html5页面二次分享的实现
Jul 30 #HTML / CSS
利用Storage Event实现页面间通信的示例代码
Jul 26 #HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
Jul 24 #HTML / CSS
htnl5利用svg页面高斯模糊的方法
Jul 20 #HTML / CSS
html5 input输入实时检测以及延时优化
Jul 18 #HTML / CSS
利用canvas实现图片压缩的示例代码
Jul 17 #HTML / CSS
You might like
PHP下escape解码函数的实现方法
2010/08/08 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
python 排列组合之itertools
2013/03/20 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
Python输出9*9乘法表的方法
2015/05/25 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
Python实现的列表排序、反转操作示例
2019/03/13 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
文员个人求职自荐信
2013/09/21 职场文书
女大学生毕业找工作的自我评价
2013/10/03 职场文书
竞赛口号大全
2014/06/16 职场文书
承租经营合作者协议书
2014/10/01 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android