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 渐变(Gradients)之CSS3 线性渐变
Jul 08 HTML / CSS
css3背景_动力节点Java学院整理
Jul 11 HTML / CSS
CSS3 中filter(滤镜)属性使用详解
Apr 07 HTML / CSS
CSS3 实现发光边框特效
Nov 11 HTML / CSS
html5文本内容_动力节点Java学院整理
Jul 11 HTML / CSS
html5标记文字_动力节点Java学院整理
Jul 11 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
May 28 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
Apr 24 HTML / CSS
html5开发三八女王节表白神器
Mar 07 HTML / CSS
HTML5 drag和drop具体使用详解
Jan 18 HTML / CSS
css3 filter属性的使用简介
Mar 31 HTML / CSS
CSS的calc函数用法小结
Jun 25 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
文章推荐系统(二)
2006/10/09 PHP
第九节--绑定
2006/11/16 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
Python实现简单的HttpServer服务器示例
2017/09/25 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
2014年国庆节演讲稿
2014/09/19 职场文书
李白故里导游词
2015/02/12 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
活动宣传稿范文
2015/07/23 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书