Unity之生成扫描二维码

前言

开篇

  • 又到了一周一分享啦,今儿小黑为了给小可爱一个好玩的,想来想去不知道弄什么。
  • 后来一想,就制作一个生成和扫描二维码的软件吧。

Unity版本及使用插件

Unity 2020.4.4f1
zxing.unity.dll 下载地址

正题

前期准备

  • 1、创建项目。
  • 2、创建Plugins文件夹并且放入 zxing.unity.dll
  • 3、编写脚本

首先生成二维码

using UnityEngine;
using UnityEngine.UI;
using ZXing; /// <summary>
/// 二维码的生成类
/// </summary>
public class QRCodeDraw : MonoBehaviour
{
public static QRCodeDraw _Instance;
private void Awake() => _Instance = this; /// <summary> 绘制好的二维码 </summary>
public Image image_QRCode; //二维码绘制类
BarcodeWriter barcodeWriter;
/// <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>
public void DrawQRCode(string formatStr)
{
//Debug.Log(formatStr);
//注意:这个宽高度大小256不要变。不然生成的信息不正确
//256有可能是这个ZXingNet插件指定大小的绘制像素点数值
Texture2D t = ShowQRCode(formatStr, 256, 256);
//转为image
Sprite image = Sprite.Create(t, new Rect(00, 0, t.width, t.height),new Vector2(0.5f,0.5f));
//显示到UI界面的图片上
///texture_QRCode = t;
image_QRCode.sprite = image;
UnityTools.Debuger.Log("想要生成二维码的内容为:" + formatStr);
}
}

然后需要扫描二维码

using UnityEngine;
using UnityEngine.UI;
using ZXing;
/// <summary>
/// 二维码扫描识别类
/// </summary>
public class QRCodeScanning : MonoBehaviour
{
public static QRCodeScanning _Instance;
private void Awake() => _Instance = this; [System.NonSerialized]
public bool bool_Result; [System.NonSerialized]
/// <summary> 扫描信息 </summary>
public string str_ScanInfo; /// <summary> 摄像机映射显示区域 </summary>
///public Texture cameraTexture;
public Image cameraTexture; private WebCamTexture webCamTexture;//摄像机映射纹理 //二维码识别类
BarcodeReader barcodeReader;//库文件的对象(二维码信息保存的地方) /// <summary>
/// 开启摄像机和准备工作
/// </summary>
void DeviceInit()
{
//1、获取所有摄像机硬件
WebCamDevice[] devices = WebCamTexture.devices; //2、获取第一个摄像机硬件的名称
string deviceName = devices[0].name;//手机后置摄像机 //3、创建实例化一个摄像机显示区域
webCamTexture = new WebCamTexture(deviceName: deviceName); //4、显示的图片信息
//cameraTexture = webCamTexture;
//Debuger.Log(webCamTexture.width + "_____"+ webCamTexture.height);
//Texture2D texture2D = Texture2Texture2D(webCamTexture);
//Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
//cameraTexture.sprite = sprite; //5、打开摄像机运行识别
if (webCamTexture.isPlaying) return;
webCamTexture.Play(); //6、实例化识别二维码信息存储对象
barcodeReader = new BarcodeReader();
} Color32[] data;//二维码图片信息以像素点颜色信息数组存放 /// <summary>
/// 识别摄像机图片中的二维码信息
/// 打印二维码识别到的信息
/// </summary>
void ScanQRCode()
{
if (!webCamTexture.isPlaying) return; //7、获取摄像机画面的像素颜色数组信息
data = webCamTexture.GetPixels32(); //8、获取图片中的二维码信息
Result result = barcodeReader.Decode(data, webCamTexture.width, webCamTexture.height); //如果获取到二维码信息了,打印出来
if (result != null)
{
//Debuger.Log(result.Text);//===》==》===》 这是从二维码识别出来的信息
str_ScanInfo = result.Text;//显示扫描信息 UnityTools.Debuger.Log("扫描结果为:" + str_ScanInfo);
_Instance.bool_Result = true; //扫描成功之后的处理
IsScanning = false;
webCamTexture.Stop(); cameraTexture.sprite = null;
}
} bool IsScanning = false;
float interval = 3;//扫描识别时间间隔 /// <summary>
/// 扫描
/// </summary>
public void Scanning()
{
if (webCamTexture != null && webCamTexture.isPlaying) return;
//Debuger.Log("开始扫描");
DeviceInit();
IsScanning = true;
}
public void Stop()
{
if (!webCamTexture.isPlaying) return;
//Debuger.Log("停止扫描");
webCamTexture.Stop();
IsScanning = false;
} Texture2D texture2D; private void Update()
{
if (IsScann/ing)
{
texture2D = Texture2Texture2D(webCamTexture); Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f)); cameraTexture.sprite = sprite; //每隔一段时间进行一次识别二维码信息
interval += Time.deltaTime;
if (interval >= 3)
{
interval = 0;
ScanQRCode();//开始扫描
}
}
} //以下参考博客https://blog.csdn.net/a673544319/article/details/82751883
Texture2D Texture2Texture2D(Texture texture)
{
Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false); RenderTexture currentRT = RenderTexture.active; RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32); Graphics.Blit(texture, renderTexture); RenderTexture.active = renderTexture; texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); texture2D.Apply(); RenderTexture.active = currentRT; RenderTexture.ReleaseTemporary(renderTexture); return texture2D;
}
}

该使用了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; public class QRCodeController : MonoBehaviour
{
public InputField inputField; public void InstanceQRCode()
{
QRCodeDraw._Instance.DrawQRCode(inputField.text);
} public void ScaningQRCode()
{
QRCodeScanning._Instance.Scanning();
}
}

挂载脚本绑定按钮和输入框

运行内容

生成二维码

扫描二维码

结尾

唠家常

  • 小黑的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加小黑的QQ:841298494,大家一起进步。
  • 小黑现在好想让小可爱来北京找我呀,哈哈哈哈哈。

今日有推荐

推荐内容:Texture 转为 Texture2D,博客链接:
Unity中Texture转Texture2D博客链接 https://blog.csdn.net/a673544319/article/details/82751883

程序的道路上学习永不停止,探索随时进行。
Let’s go. Just do it. We can.

最新文章

  1. Error connecting to database [Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (13)]
  2. java基础总结——开篇
  3. WCF分分钟入门
  4. IOS基础之 (设计模式)
  5. Android开发环境的调研
  6. 对于python,一切事物都是对象,对象基于类创建
  7. Java动态替换InetAddress中DNS的做法简单分析1
  8. 1061. Dating (20)
  9. [转载]js javascript 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
  10. 【iOS开发】添加子控件方式(懒加载,GCC)
  11. PHP集成环境自定义设置PHP版本,同时运行多个php版本,700个PHP版本随时切换,一键开启常用模块。
  12. 搞java的都土鳖
  13. 【经验随笔】Restlet Client发送XML格式参数消息
  14. Day1 《机器学习》第一章学习笔记
  15. jquery中点击切换的实现
  16. 2.4 random 模块
  17. Top值
  18. fork exec source的区别
  19. 题解——Codeforces Round #508 (Div. 2) T3 (贪心)
  20. 关于Object.prototype.toString.call

热门文章

  1. Cookie、Session、Token与JWT(跨域认证)
  2. Electron是什么以及可以做什么
  3. &#128512; Java并发 - (并发基础)
  4. ssh明文密码小工具:sshpass
  5. 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)
  6. 【RocketMQ】顺序消息实现原理
  7. Linux配置篇 - Vmware网络配置
  8. Linux禁止摄像头自动曝光(手动调节曝光)
  9. MySQL库,表,数据的操作
  10. java面试题-常用框架