使用Unity扫描场景内的二维码,使用插件ZXing

embedded/2024/9/22 21:14:52/

使用Unity扫描场景内的二维码,使用插件ZXing

使用Unity扫描场景内的二维码,ZXing可能没有提供场景内扫描的方法,只有调用真实摄像机扫描二维码的方法。
实现的原理是:在摄像机上添加脚本,发射射线,当射线打到rawimage的时候获取rawimage的texture并作为二维码扫描。
支持webgl,windows。

代码

生成二维码,需要有zxing.unity.dll

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using ZXing.Common;
using ZXing;/// <summary>
/// 生成二维码
/// </summary>
public class GenerateQRCode : MonoBehaviour
{public RawImage rawImage;void Start(){//整数倍变化256*NrawImage.texture = GenerateQRImageWithColor("hello word!", 256 * 3, Color.black);}/// <summary>/// 生成二维码 /// </summary>/// <param name="content">二维码内容</param>/// <param name="widthAndTall">宽度高度和宽度</param>/// <param name="color">二维码颜色</param>public Texture2D GenerateQRImageWithColor(string content, int widthAndTall, Color color){BitMatrix bitMatrix;Texture2D texture = GenerateQRImageWithColor(content, widthAndTall, widthAndTall, color, out bitMatrix);return texture;}/// <summary>/// 生成2维码 方法二/// 经测试:能生成任意尺寸的正方形/// </summary>/// <param name="content"></param>/// <param name="width"></param>/// <param name="height"></param>Texture2D GenerateQRImageWithColor(string content, int width, int height, Color color, out BitMatrix bitMatrix){// 编码成color32MultiFormatWriter writer = new MultiFormatWriter();Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();//设置字符串转换格式,确保字符串信息保持正确hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");// 设置二维码边缘留白宽度(值越大留白宽度大,二维码就减小)hints.Add(EncodeHintType.MARGIN, 1);hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.M);//实例化字符串绘制二维码工具bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 转成texture2dint w = bitMatrix.Width;int h = bitMatrix.Height;print(string.Format("w={0},h={1}", w, h));Texture2D texture = new Texture2D(w, h);for (int x = 0; x < h; x++){for (int y = 0; y < w; y++){if (bitMatrix[x, y]){texture.SetPixel(y, x, color);}else{texture.SetPixel(y, x, Color.white);}}}texture.Apply();return texture;}/// <summary>/// 生成2维码 方法三/// 在方法二的基础上,添加小图标/// </summary>/// <param name="content"></param>/// <param name="width"></param>/// <param name="height"></param>/// <returns></returns>Texture2D GenerateQRImageWithColorAndIcon(string content, int width, int height, Color color, Texture2D centerIcon){BitMatrix bitMatrix;Texture2D texture = GenerateQRImageWithColor(content, width, height, color, out bitMatrix);int w = bitMatrix.Width;int h = bitMatrix.Height;// 添加小图int halfWidth = texture.width / 2;int halfHeight = texture.height / 2;int halfWidthOfIcon = centerIcon.width / 2;int halfHeightOfIcon = centerIcon.height / 2;int centerOffsetX = 0;int centerOffsetY = 0;for (int x = 0; x < h; x++){for (int y = 0; y < w; y++){centerOffsetX = x - halfWidth;centerOffsetY = y - halfHeight;if (Mathf.Abs(centerOffsetX) <= halfWidthOfIcon && Mathf.Abs(centerOffsetY) <= halfHeightOfIcon){texture.SetPixel(x, y,centerIcon.GetPixel(centerOffsetX + halfWidthOfIcon, centerOffsetY + halfHeightOfIcon));}}}texture.Apply();// 存储成文件byte[] bytes = texture.EncodeToPNG();string path = System.IO.Path.Combine(Application.dataPath, "qr.png");System.IO.File.WriteAllBytes(path, bytes);return texture;}
}

扫描二维码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using ZXing;/// <summary>
/// 扫描二维码
/// </summary>
public class ScanQRCode : MonoBehaviour
{public Camera customCamera;public UnityEngine.UI.Text showText;public UnityEngine.UI.Button btnStartScan;public LayerMask layerMask; // 需要检测的图层public float rayLength = 5f; // 射线长度void Start(){btnStartScan.onClick.AddListener(OnStartScamOnClick);}private void OnStartScamOnClick(){// 发射一条射线从指定摄像机的屏幕中心Ray ray = customCamera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));// 使用 EventSystem 进行 UI 射线检测PointerEventData pointerEventData = new PointerEventData(EventSystem.current);pointerEventData.position = new Vector2(Screen.width / 2, Screen.height / 2);List<RaycastResult> results = new RaycastResult[1].ToList();EventSystem.current.RaycastAll(pointerEventData, results);// 如果检测到了UI元素if (results.Count > 0){// 返回UI元素的名称Debug.Log("Hit UI object: " + results[0].gameObject.name);string imgo = GetColorImage(results[0].gameObject);showText.text= imgo;}else{// 如果没有检测到UI元素,则进行3D场景中的射线检测RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo, rayLength)){// 返回击中物体的名称Debug.Log("Hit object: " + hitInfo.collider.gameObject.name);}}}private string GetColorImage(GameObject go){RawImage rawImage;if (!go.TryGetComponent<RawImage>(out rawImage)){return "";}Texture2D texture = rawImage.texture as Texture2D;try{// 创建二维码解码器IBarcodeReader barcodeReader = new BarcodeReader();// 解码纹理中的二维码Result result = barcodeReader.Decode(texture.GetPixels32(), texture.width, texture.height);// 返回解码结果return result != null ? result.Text : null;}catch (System.Exception ex){showText.text = ("Error scanning QR code: " + ex.Message);Debug.LogError("Error scanning QR code: " + ex.Message);return null;}}}

场景布置

在这里插入图片描述

下载

可以私信下载
https://download.csdn.net/download/GoodCooking/89208272

http://www.ppmy.cn/embedded/20329.html

相关文章

PeLK: 大卷积核强势回归,高达101 × 101,提出了外围卷积

paper&#xff1a;https://arxiv.org/pdf/2403.07589 code&#xff1a;暂无 目录 0. 摘要 1. 引言 2. 相关工作 2.1. Large Kernel Convolutional Networks 2.2. Peripheral Vision for Machine Learning 3. 密集卷积优于条纹卷积 4. 参数高效的大核卷积神经网络 4.1. …

【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

前端框架编译器之模板编译

编译原理概述 编译原理&#xff1a;是计算机科学的一个分支&#xff0c;研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言&#xff1a;Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码&#xff1a;机器码、汇…

bayesplot|分享一个可视化贝叶斯模型的R包

1.bayesplot介绍 该包主要用于贝叶斯模型的可视化分析&#xff0c;提供了一系列工具来帮助评估、理解和诊断贝叶斯模型。这个包特别适用于与 Stan 以及其他提供 MCMC 样本的软件如 JAGS 和 BUGS 的模型输出。 后验分布图:包括密度图、直方图和区间图&#xff0c;用于展示模型…

vscode连接远程Linux服务器时,没有权限新建文件夹或者文件

参考链接&#xff1a; VS code 保存或新建文件没有权限的问题 vscode连接远程Linux服务器时&#xff0c;没有权限新建文件夹或者文件&#xff1a; 用一条命令解决&#xff1a; sudo chown -R myuser /path/to/foldermyuser是当前用户名&#xff0c; /path/to/folder是 需要操…

【微磁学:扒一扒mumax3的内核】LLG方程的多种求解方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、LLG方程和微磁学模拟之间的联系二、LLG方程的形式三、微磁学模拟中的LLG方程求解部分四、代码部分五、总结 前言 最近我很想把现微磁学模拟器的内容拆开看…

python在Django中使用django-mptt库来实现无限级树结构非常直观和方便

在Django中使用django-mptt库来实现无限级树结构非常直观和方便。django-mptt(Modified Preorder Tree Traversal)是一个用于Django模型的树形结构字段的库,它允许你通过递归的方式轻松地构建和操作树形结构。 下面是一个使用django-mptt和MySQL数据库实现无限级树结构的基…

java导出pdf(水印、页眉、表格、背景样式、页脚、饼图、柱图)

这里写自定义目录标题 controller层pdf模板RiskReportTemplate1(页脚、水印)多线程导出pdf数据pdf导出工具类(页眉、图片底纹、柱图、饼图、表格、一级二级标题)实体类pdf工具类&#xff08;根据html生成pdf文件&#xff09;页脚工具类柱图工具类饼图工具类 controller层 Post…