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

使用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.hqwc.cn/news/640919.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio开发工具学习之Git远程仓库拉取与推送

Git远程仓库操作 1.1 推送项目到远端服务器1.1.1 进入Gitee或Github、创建一个新的仓库1.1.2 将Android Studio中项目推送至Gitee 1.2 从远端服务器拉取项目1.2.1 AS工程页拉取新项目1.2.2 AS启动页拉取项目 1.1 推送项目到远端服务器 1.1.1 进入Gitee或Github、创建一个新的仓…

Qt 跨平台开发

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

Hive 表添加列(新增字段)

前言 记录总结一下 Hive 表如何添加新的字段以及遇到的问题。 最初是因为要验证 Hudi Schema Evolution 中的增加字段问题 SQL alter table test_hive add columns (col_new string);# 级联应用到分区表的所有分区 # 对于 Parquet、Text 分区表需要加cascade &#xff0c; OR…

STM32F1串口

文章目录 1 数据通信的基础概念1.11.21.31.41.5 2 串口(RS-232&#xff09;2.12.22.32.42.5 3 STM32的USART3.13.23.33.53.9 USART寄存器介绍 4 HAL库外设初始化MSP回调机制5 HAL库中断回调机制6 USART/UART异步通信配置步骤 &#xff08;包括HAL库相关函数&#xff09;6.16.26…

unity读写本地excel_2024.4.22

using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using Excel; using System.Data; using System; /// <summary> /// https://blog.csdn.net/Xz616/article/details/128893023 /// Unity3D操作…

管理集群工具之LVS

管理集群工具之LVS 集群概念 将很多机器组织在一起&#xff0c;作为一个整体对外提供服务集群在扩展性、性能方面都可以做到很灵活集群分类 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing …

JS 分片任务的高阶函数封装

前言 在我们的实际业务开发场景中&#xff0c;有时候我们会遇到渲染大量元素的场景&#xff0c;往往这些操作会使页面卡顿&#xff0c;给用户带来非常不好的体验&#xff0c;这时候我们就需要给任务分片执行。 场景复现 我们看一段代码&#xff1a; <!DOCTYPE html> &l…

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先&#xff08;leader&#xff09;地位。 其LCAP产品是Microsoft Power Apps&#xff0c;扩展了AI Builder、Dataverse、Power Automate和Power Pages&#xff0c;这些都包…

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

keil把c语言函数转成汇编

汇编可以让开发人员从根源上理解程序的运行逻辑&#xff0c;本文介绍如何在keil环境下如何把一个c文件中的某一个函数&#xff0c;转换为汇编函数&#xff0c;并编译运行。 右击某个c文件&#xff0c;选择Option for File。。。 图1 然后把下图中的Generate Assembler SRC Fi…

自动驾驶控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

【bug】使用mmsegmentaion遇到的问题

利用mmsegmentaion跑自定义数据集时的bug处理&#xff08;使用bisenetV2&#xff09; 1. ValueError: val_dataloader, val_cfg, and val_evaluator should be either all None or not None, but got val_dataloader{batch_size: 1, num_workers: 4}, val_cfg{type: ValLoop}, …