Unity 二维码的生成与扫描

效果:
在这里插入图片描述

点击这里下载zxing.unity.dll

将这个dll放到unity中,创建一个raw Image和Button,拖拽赋值,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ZXing;
using UnityEngine.UI;

public class Draw : MonoBehaviour
{
    [Header("绘制好的二维码显示界面")]
    public RawImage QRCode;
    //二维码绘制类
    BarcodeWriter barcodeWriter;
    [SerializeField]
    private Button drawbutton;
    /// <summary>
    /// 将制定字符串信息转换成二维码图片信息
    /// </summary>
    /// <param name="formatStr">要生产二维码的字符串信息</param>
    /// <param name="width">二维码的宽度</param>
    /// <param name="height">二维码的高度</param>
    /// <returns>返回二维码图片的颜色数组信息</returns>
    Color32[] GeneQRCode(string formatStr, int width, int height)
    {
        //绘制二维码前进行一些设置
        ZXing.QrCode.QrCodeEncodingOptions options =
            new ZXing.QrCode.QrCodeEncodingOptions();
        //设置字符串转换格式,确保字符串信息保持正确
        options.CharacterSet = "UTF-8";
        //设置绘制区域的宽度和高度的像素值
        options.Width = width;
        options.Height = height;
        //设置二维码边缘留白宽度(值越大留白宽度大,二维码就减小)
        options.Margin = 1;

        //实例化字符串绘制二维码工具
        barcodeWriter = new BarcodeWriter { Format = BarcodeFormat.QR_CODE, Options = options };
        //进行二维码绘制并进行返回图片的颜色数组信息
        return barcodeWriter.Write(formatStr);

    }

    /// <summary>
    /// 根据二维码图片信息绘制指定字符串信息的二维码到指定区域
    /// </summary>
    /// <param name="str">要生产二维码的字符串信息</param>
    /// <param name="width">二维码的宽度</param>
    /// <param name="height">二维码的高度</param>
    /// <returns>返回绘制好的图片</returns>
    Texture2D ShowQRCode(string str, int width, int height)
    {
        //实例化一个图片类
        Texture2D t = new Texture2D(width, height);
        //获取二维码图片颜色数组信息
        Color32[] col32 = GeneQRCode(str, width, height);
        //为图片设置绘制像素颜色信息
        t.SetPixels32(col32);
        //设置信息更新应用下
        t.Apply();
        //将整理好的图片信息显示到指定区域中
        return t;
    }

    /// <summary>
    /// 开始绘制指定信息的二维码
    /// </summary>
    /// <param name="formatStr"></param>
    void DrawQRCode(string formatStr)
    {
        //注意:这个宽高度大小256不要变。不然生成的信息不正确
        //256有可能是这个ZXingNet插件指定大小的绘制像素点数值
        Texture2D t = ShowQRCode(formatStr, 256, 256);

        //显示到UI界面的图片上
        QRCode.texture = t;
    }


    public string QRCodeText = "二维码";
    void DrawButtonClick()
    {
        DrawQRCode(QRCodeText);
    }

    private void Start()
    {
        drawbutton.onClick.AddListener(DrawButtonClick);
    }

}

这样就完成了生成二维码的操作。

接下来就是扫描二维码。

新建一个Raw Image用来显示摄像机画面的,再新建一个Text用来显示扫描到的文本信息的,还有一个按钮,然后拖拽赋值,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ZXing;
using UnityEngine.UI;
/// <summary>
/// 二维码扫描识别功能
/// </summary>
public class Scaning : MonoBehaviour
{
    [Header("摄像机检测界面")]
    public RawImage cameraTexture;//摄像机映射显示区域

    private WebCamTexture webCamTexture;//摄像机映射纹理
    public Text text;//用来显示扫描信息
    //二维码识别类
    BarcodeReader barcodeReader;//库文件的对象(二维码信息保存的地方)

    /// <summary>
    /// 开启摄像机和准备工作
    /// </summary>
    void DeviceInit()
    {
        //1、获取所有摄像机硬件
        WebCamDevice[] devices = WebCamTexture.devices;
        //2、获取第一个摄像机硬件的名称
        string deviceName = devices[0].name;//手机后置摄像机
        //3、创建实例化一个摄像机显示区域
        webCamTexture = new WebCamTexture(deviceName, 400, 300);
        //4、显示的图片信息
        cameraTexture.texture = webCamTexture;
        //5、打开摄像机运行识别
        webCamTexture.Play();

        //6、实例化识别二维码信息存储对象
        barcodeReader = new BarcodeReader();
    }

    Color32[] data;//二维码图片信息以像素点颜色信息数组存放

    /// <summary>
    /// 识别摄像机图片中的二维码信息
    /// 打印二维码识别到的信息
    /// </summary>
    void ScanQRCode()
    {
        //7、获取摄像机画面的像素颜色数组信息
        data = webCamTexture.GetPixels32();
        //8、获取图片中的二维码信息
        Result result = barcodeReader.Decode(data, webCamTexture.width, webCamTexture.height);
        //如果获取到二维码信息了,打印出来
        if (result != null)
        {
            Debug.Log(result.Text);//二维码识别出来的信息
            text.text = result.Text;//显示扫描信息

            //扫描成功之后的处理
            IsScanning = false;
            webCamTexture.Stop();
        }
    }


    /// <summary>
    /// Start 初始化函数
    /// </summary>
    private void Start()
    {
        scanningButton.onClick.AddListener(ScanningButtonClick);
    }


    bool IsScanning = false;
    float interval = 0.5f;//扫描识别时间间隔
    [SerializeField]
    private Button scanningButton;
    void ScanningButtonClick()
    {
        DeviceInit();
        IsScanning = true;
    }

    private void Update()
    {
        if (IsScanning)
        {
            //每隔一段时间进行一次识别二维码信息
            interval += Time.deltaTime;
            if (interval >= 3)
            {
                interval = 0;
                ScanQRCode();//开始扫描
            }
        }
    }

}

生成二维码和扫码的操作就完成了。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值