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 相关文章推荐
CSS3实现的闪烁跳跃进度条示例(附源码)
Aug 19 HTML / CSS
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
Oct 10 HTML / CSS
详解CSS3新增的背景属性
Dec 25 HTML / CSS
css3 实现滚动条美化效果的实例代码
Jan 06 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
Jan 01 HTML / CSS
HTML5拖拽的简单实例
May 30 HTML / CSS
解决HTML5手机端页面缩放的问题
Oct 27 HTML / CSS
HTML5之消息通知的使用(Web Notification)
Oct 30 HTML / CSS
HTML页面滚动时部分内容位置固定不滚动的实现
Apr 14 HTML / CSS
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
Dec 24 HTML / CSS
html原生table实现合并单元格以及合并表头的示例代码
May 07 HTML / CSS
HTML 里 img 元素的 src 和 srcset 属性的区别详解
May 21 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
实例解析Python中的__new__特殊方法
2016/06/02 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
Python 如何展开嵌套的序列
2020/08/01 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
租赁意向书范本
2014/04/01 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
给老婆的保证书
2015/01/16 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
企业团队精神心得体会
2016/01/19 职场文书
nginx容器方式反向代理实战
2022/04/18 Servers