React生成二维码并将canvas转换成img格式

1. 导入包生成二维码

npm install qrcode.react

npm包链接: https://www.npmjs.com/package/qrcode.react

1.1 生成二维码:

import * as QrCode from 'qrcode.react'

render() {
    return (
        <QrCode value={“二维码内容”} size={80} id="qrCode"/>
    )
}

/* 注意这个id下文转图片格式的时候会用到 */

 

2.将生成的canvas格式二维码转换成image格式

基本思路是: canvas -> toDataUrl -> 转换成base64编码的image格式

延展开来如果要做 web端的点击下载: canvas -> toDataUrl() -> image -> a标签, a.download = "下载文件名" 

H5的点击按钮下载二维码 楼主暂时没有实现,如果以后做出来了会更新,或者有大佬可以分享一下。

 

2.1 转图片

let canvasImg = document.getElementsByTagName('canvas')[0];
let image = new Image();

// canvas.toDataUrl() 可以将canvas格式的文件转换成基于base64的指定格式的图片
// 注意这个api ie9以下不支持

image.src = canvasImg.toDataURL("image/png");
let alink = document.createElement("img");
    alink.className = 'qrcode';
    alink.src = image.src;
    alink.download = "下载文件的名字.png";

//然后用这个我们创造的 img 节点去替换 canvasImg节点 这样原来在dom节点里的canvas就会被替换成image拉

canvasImg.parentNode.replaceChild(alink,canvasImg);

        

2.2 

一直用框架的朋友可能对原生的一些语句生疏了,比如我本人... 所以最后来复习一下dom节点操作的方法:

2.2.1、创建元素节点:createElement

用法:document.createElement("p");//创建p标签;

    创建文本节点:createTextNode;

用法:document.createTextNode("txt");//创建文本标签;

2.2.2、插入节点:appendchild:在要插入的元素节点上调用,他插入指定的节点使其成为那个节点的最后一个子节点。

                   insertBefore:在已有的元素前插入一个新元素;

                   insertAfter:在现有的元素后面插入一个新元素;

2.2.3、删除节点:removeChild;从文档树中删除一个节点(先找到要删除节点的父节点,用父节点删除);

                  用法:var para1=document.getElementById("p1");

                               para1.parentNode.removeChild(para1);

2.2.4、替换节点:replaceChild;将一个节点替换为另一个节点(先找到要替换的节点的父节点,用父节点替换);

 

 

补充:

上述方法 只是将指定的二维码换成了image,但是只是静态换一次。为了动态的换二维码,楼主封了个土味方法,有更好的方法的话可以赐教一下。

原理就是不替换节点,而是插入节点,同时把 canvas节点 display:none

changeCanvasToPic = () => {
        let canvasImg = document.getElementsByTagName('canvas')[0];
        let image = new Image();
        image.src = canvasImg.toDataURL("image/png");
        //将canvas格式图片转换成image
        let alink = document.createElement("img");
        alink.className = 'qrcode';
        alink.id ="qr-img";
        alink.src = image.src;
        alink.download = "ceshi.png";
        let qrImg = document.getElementById('qr-img');
        if(qrImg){
            canvasImg.parentNode.replaceChild(alink,qrCode);
        } else{
            canvasImg.parentNode.insertBefore(alink,canvasImg);
        }
    }


render(){
    return(
    <QRCode value={this.state.address} size={100} style={{display:'none'}} 
            id="qrCode" />
)
}

 

上文资料参考:

https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toDataURL

https://www.jianshu.com/p/d91216d465d9

https://blog.youkuaiyun.com/qq_38130094/article/details/80509131

要解析二维码,我们需要使用一个 JavaScript 库,例如 `qr-scanner`。此外,我们需要将 base64 编码的图像换为可供解析的二进制数据。 以下是一个示例代码,它演示了如何在 React 中使用 `qr-scanner`。 首先,我们需要安装 `qr-scanner`: ``` npm install qr-scanner ``` 然后,我们可以创建一个组件来处理二维码解析。这个组件将接受一个 base64 编码的图像,尝试解析其中的二维码。 ```javascript import React, { useEffect } from 'react'; import QRScanner from 'qr-scanner'; const QrCodeReader = ({ base64Image, onQrCodeDetected }) => { useEffect(() => { const decodeQrCode = async () => { const img = new Image(); img.src = base64Image; await img.decode(); const canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; canvas.getContext('2d').drawImage(img, 0, 0); const imageData = canvas.getContext('2d').getImageData(0, 0, img.width, img.height); const qrCode = await QRScanner.scan(imageData); onQrCodeDetected(qrCode); }; decodeQrCode(); }, [base64Image, onQrCodeDetected]); return null; }; export default QrCodeReader; ``` 在这个组件中,我们使用 `useEffect` 钩子来处理解析二维码的逻辑。在这个钩子中,我们首先创建一个新的图片对象加载 base64 编码的图像。然后,我们等待这个图片加载,且创建一个新的 canvas 元素,将图像绘制到 canvas 上。 接下来,我们获取 canvas 上的图像数据,将其传递给 `qr-scanner` 库,以尝试解析其中的二维码。最后,我们将解析结果传递给父组件,以便它可以处理这个结果。 现在,我们可以在父组件中使用 `QrCodeReader` 组件,将 base64 编码的图像作为属性传递给它。当解析成功时,我们可以在回调函数中处理解析结果。 ```javascript import React, { useState } from 'react'; import QrCodeReader from './QrCodeReader'; const App = () => { const [qrCode, setQrCode] = useState(''); const handleQrCodeDetected = (qrCode) => { setQrCode(qrCode); }; return ( <div> <QrCodeReader base64Image={BASE64_IMAGE} onQrCodeDetected={handleQrCodeDetected} /> <p>{qrCode}</p> </div> ); }; export default App; ``` 在这个示例中,我们在父组件中定义了一个状态变量 `qrCode`,用于存储解析结果。当解析成功时,我们将结果渲染到页面上。 请注意,这个示例只是一个基本的演示,实际应用中可能需要对解析过程进行更多的处理和错误处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值