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 弹性布局快速入门
Jun 06 HTML / CSS
纯css3实现的动画按钮的实例教程
Nov 17 HTML / CSS
css3 transform及原生js实现鼠标拖动3D立方体旋转
Jun 20 HTML / CSS
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
Jan 23 HTML / CSS
详解使用HTML5的classList属性操作CSS类
Oct 13 HTML / CSS
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
Apr 24 HTML / CSS
HTML5未来发展趋势
Feb 01 HTML / CSS
浅谈HTML5 &amp; CSS3的新交互特性
Jul 19 HTML / CSS
详解android与HTML混合开发总结
Jun 06 HTML / CSS
HTML中meta标签及Keywords
Apr 15 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 HTML / CSS
CSS精灵图的原理与使用方法介绍
Mar 17 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
实用函数4
2007/11/08 PHP
PHP 各种排序算法实现代码
2009/08/20 PHP
php合并js请求的例子
2013/11/01 PHP
php数组合并的二种方法
2014/03/21 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
js三种排序算法分享
2012/08/16 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
Python脚本实时处理log文件的方法
2016/11/21 Python
Python的语言类型(详解)
2017/06/24 Python
使用python实现knn算法
2017/12/20 Python
django和vue实现数据交互的方法
2019/08/21 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
倡议书范文
2014/04/16 职场文书
创先争优一句话承诺
2014/05/29 职场文书
质量月口号
2014/06/20 职场文书
文明社区申报材料
2014/08/21 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
教师见习总结范文
2015/06/23 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
2019年大学推荐信
2019/06/24 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android