Unity 二维码的生成与识别(基于Zxing)

本教程基于Zxing,依赖Zxing.unity.dll,适用于PC端和Android端,离线可用。
Unity版本:2018.4.23f
Zxing:GitHub下载
Unity Demo下载:点我下载
在这里插入图片描述

成品如下:成品

二维码扫描:

1.新建画布
2.创建一个RawImage
3.创建一个Button
4.创建一个Text
扫描
脚本如下:每一句都有注释

using UnityEngine;
using UnityEngine.UI;
using ZXing;

///扫描二维码()=》识别二维码信息
public class QRCodeScanning : MonoBehaviour
{
    BarcodeReader BarcodeReader;//库文件的对象(二维码信息保存的位置)

    private bool isScanning = false;//扫描开关
    private float interval = 3;//扫描识别时间间隔
    private WebCamTexture WebCamTexture;//摄像机映射纹理
    private Color32[] data;//让信息以像素点的形式 按照数据存放

    public Button Sacnning;//扫描Button
    public RawImage CameraTexture;//摄像机映射显示区域
    public Text text;//用来显示扫描的信息


    private void Start()
    {
        Sacnning.onClick.AddListener(SacnningButton);
    }

    private void Update()
    {
        if (isScanning)//每三秒扫描一次
        {
            interval += Time.deltaTime;
            if (interval >= 3)
            {
                interval = 0;
                SacnQRCode();//开始扫描
            }
        }
    }


    /// <summary>
    /// 识别二维码信息
    /// </summary>
    void SacnQRCode()
    {
        data = WebCamTexture.GetPixels32();//获取摄像机中的像素点数组的信息

        Result result = BarcodeReader.Decode(data, WebCamTexture.width, WebCamTexture.height);//获取二维码上的信息

        if (result != null)//判断是否有信息 有则识别成功
        {
            text.text = result.Text;//显示 二维码上的信息

            isScanning = false;//关闭识别

            WebCamTexture.Stop();//停止识别

            Sacnning.onClick.AddListener(SacnningButton);
        }

    }


    /// <summary>
    /// Sacnning按钮
    /// </summary>
    void SacnningButton()
    {
        Sacnning.onClick.RemoveListener(SacnningButton);

        DeviceInit();//开始摄像机

        isScanning = true;//打开扫描开关

        text.text = null;//清空文本

    }

	/// <summary>
    /// 开启摄像机 前期准备工作
    /// </summary>
    void DeviceInit()
    {
        WebCamDevice[] devices = WebCamTexture.devices;//获取所有摄像机的硬件 比如前置 后置

        WebCamTexture = new WebCamTexture(devices[0].name, 300, 300);//创建一个摄像机显示的区域 (device[0]一般是后置摄像头,400,300为大小)

        CameraTexture.texture = WebCamTexture;//显示图片信息

        WebCamTexture.Play();//打开摄像机进行识别

        BarcodeReader = new BarcodeReader();//实例化二维码信息,并存储对象

    }
}

二维码生成

1.新建画布
2.创建一个RawImage
3.创建一个Button
4.PC端测试的话需要准备一个摄像头
生成
脚本如下:每一句都有注释

using UnityEngine;
using UnityEngine.UI;
using ZXing;

//生成二维码
public class QRCodeDrawing : MonoBehaviour
{
    public RawImage QRCode;//绘制好的二维码
    public Button DrawButton;//生成按钮
    public string QRCodeText = null;//二维码内容,自己填 
    BarcodeWriter BarcodeWriter;//二维码绘制类

    private void Start()
    {
        DrawButton.onClick.AddListener(() => DrowQRCode(QRCodeText));
    }


    /// <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 texture = new Texture2D(width, height);

        Color32[] colors = GeneQRCode(str, width, height);

        texture.SetPixels32(colors);

        texture.Apply();

        return texture;
    }


    /// <summary>
    /// 绘制二维码
    /// </summary>
    /// <param name="formatStr">二维码信息</param>
    void DrowQRCode(string formatStr)
    {
        Texture2D texture = ShowQRCode(formatStr, 256, 256);//注意:这个宽高度大小256不要变。不然生成的信息不正确
                                                            //256有可能是这个ZXingNet插件指定大小的绘制像素点数值
        QRCode.texture = texture;//显示到UI界面的图片上
    }



}

提示:需要在QRCodeText出手动填写二维码内容!!!!
非常简单,不懂留言咨询!

如果有用→欢迎三连♪(・ω・)ノ

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值