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 用border写 空心三角箭头 (两种写法)
Sep 29 HTML / CSS
Css3+Js制作漂亮时钟(附源码)
Apr 24 HTML / CSS
CSS3实现闪烁动画效果的方法
Feb 09 HTML / CSS
css3实现3D文本悬停改变效果的示例代码
Jan 16 HTML / CSS
canvas像素画板的实现代码
Nov 21 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
Aug 14 HTML / CSS
简单介绍HTML5中的文件导入
May 08 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
Mar 22 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
Apr 26 HTML / CSS
HTML5中的强制下载属性download使用实例解析
May 12 HTML / CSS
如何查看浏览器对html5的支持情况
Dec 15 HTML / CSS
关于CSS自定义属性与前端页面的主题切换问题
Mar 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
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
Javascript !!的作用
2008/12/04 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
Python 字符串大小写转换的简单实例
2017/01/21 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python冲顶大会 快来答题!
2018/01/17 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
会计自我鉴定
2013/11/02 职场文书
经理职责范文
2013/11/08 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
留学推荐信怎么写
2015/03/26 职场文书
创业计划书之校园超市
2019/09/12 职场文书
java设计模式--七大原则详解
2021/07/21 Java/Android
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers