当前位置:   article > 正文

Unity 工具 之 ZXing QRCode 二维码的生成和识别(可设置生成不同颜色的/带图标的二维码)_unity zxing

unity zxing

 

Unity 工具 之 ZXing QRCode 二维码的生成和识别(可设置生成不同颜色的/带图标的二维码)

 

目录

Unity 工具 之 ZXing QRCode 二维码的生成和识别(可设置生成不同颜色的/带图标的二维码)

一、简单介绍

二、实现原理

三、注意实现

四、效果预览

五、ZXing.net ( zxing.unity.dll ) 插件下载

六、实现步骤

七、关键代码


 

一、简单介绍

Unity 开发中,自己整理的一些游戏开发可能用到的功能,整理归档,方便游戏开发。

ZXing QRCode 二维码的生成和识别,调用 zxing.unity.dll 里面的接口 ,很容易实现自己需要的相关二维码的生成和识别功能。

 

二、实现原理

1、两种方法生成二维图:

  • BarcodeWriter 通过 Write 即可生一个可以Unity操作的 Color32[] ;

  • MultiFormatWriter 通过 encode 即可返回一个 BitMatrix ,便于Unity 像素操作 ;

2、通过对像素的操作,可以实现改变 二维码的颜色,以及添加小图标的功能

3、二维码识别:

  • Unity 打开相机,获取相机的图片

  • 传入相机的图片,通过 BarcodeReader类中的Decode() 解析图片,实现识别二维码功能

 

三、注意实现

1、生成带有小图标的二维码,注意小图标的图片添加读写功能,不然代码中可能会报错,图片不可读写等

2、在生成二维码图片时,设置宽高一般为 256 ,256 有可能是这个ZXingNet插件指定大小的绘制像素点数值,这个宽高度大小256尽量不要变(变的话,最好是倍数变化),不然生成的信息可能不正确

3、生成带有小图标的二维码,小图标不要太大(这里是50x50),避免影响识别效果

 

四、效果预览

 

五、ZXing.net ( zxing.unity.dll ) 插件下载

1、ZXing.net 相关网址如下

ZXing.net 网址:https://archive.codeplex.com/?p=zxingnet

ZXing.net github:https://github.com/micjahn/ZXing.Net

ZXing.net Release 网址:https://github.com/micjahn/ZXing.Net/releases/

 

2、ZXing.net Release 发布版本下载,根据需要选择版本即可(一般是最新的吧,看情况)

ZXing.net Release 网址:https://github.com/micjahn/ZXing.Net/releases/

 

3、点击下载即可

 

4、解压,找到对应的unity文件夹,就可以得到对应的 zxing.unity.dll

 

六、实现步骤

1、打开Unity,新建Unity工程

 

2、导入 zxing.unity.dll

 

3、导入一张小图标,并添加读写权限,如下图

 

4、新建 GenerateQRCode 场景,添加 RawImage,布局如下

 

5、新建脚本,编写二维码生成代码

 

6、把生成二维码脚本ZXingQRCodeWrapper_GenerateQRCode,挂载到场景中,并对应赋值

 

7、运行场景,二维码生成,如图

 

8、新建 ScanQRCode 场景,添加 RawImage\Button\Text,布局如下

 

9、新建脚本,编写二维码识别代码

 

10、把脚本挂载到场景中,并对应赋值

 

11、运行场景,点击 Scan,进行识别,效果如下

(注意:这里PC测试,要有相机哈)

 

七、关键代码

1、ZXingQRCodeWrapper_GenerateQRCode

  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using ZXing;
  5. using ZXing.Common;
  6. public class ZXingQRCodeWrapper_GenerateQRCode : MonoBehaviour
  7. {
  8. public RawImage img1;
  9. public RawImage img2;
  10. public RawImage img3;
  11. public Texture2D icon;
  12. // Use this for initialization
  13. void Start()
  14. {
  15. //注意:这个宽高度大小256不要变(变的话,最好是倍数变化)。不然生成的信息可能不正确
  16. //256有可能是这个ZXingNet插件指定大小的绘制像素点数值
  17. img1.texture = GenerateQRImage1("Hello Wrold!", 512, 512);
  18. img2.texture = GenerateQRImageWithColor("I Love You!", 256, 256,Color.red);
  19. img3.texture = GenerateQRImageWithColorAndIcon("中间带图片的二维码图片", 256, 256, Color.blue, icon);
  20. }
  21. /// <summary>
  22. /// 生成2维码 方法一
  23. /// 经测试:只能生成256x256的
  24. /// </summary>
  25. /// <param name="content"></param>
  26. /// <param name="width"></param>
  27. /// <param name="height"></param>
  28. Texture2D GenerateQRImage1(string content, int width, int height)
  29. {
  30. // 编码成color32
  31. EncodingOptions options = null;
  32. BarcodeWriter writer = new BarcodeWriter();
  33. options = new EncodingOptions
  34. {
  35. Width = width,
  36. Height = height,
  37. Margin = 1,
  38. };
  39. options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
  40. writer.Format = BarcodeFormat.QR_CODE;
  41. writer.Options = options;
  42. Color32[] colors = writer.Write(content);
  43. // 转成texture2d
  44. Texture2D texture = new Texture2D(width, height);
  45. texture.SetPixels32(colors);
  46. texture.Apply();
  47. 存储成文件
  48. //byte[] bytes = texture.EncodeToPNG();
  49. //string path = System.IO.Path.Combine(Application.dataPath, "qr.png");
  50. //System.IO.File.WriteAllBytes(path, bytes);
  51. return texture;
  52. }
  53. /// <summary>
  54. /// 生成2维码 方法二
  55. /// 经测试:能生成任意尺寸的正方形
  56. /// </summary>
  57. /// <param name="content"></param>
  58. /// <param name="width"></param>
  59. /// <param name="height"></param>
  60. Texture2D GenerateQRImageWithColor(string content, int width, int height, Color color) {
  61. BitMatrix bitMatrix;
  62. Texture2D texture = GenerateQRImageWithColor(content, width, height, color, out bitMatrix);
  63. return texture;
  64. }
  65. /// <summary>
  66. /// 生成2维码 方法二
  67. /// 经测试:能生成任意尺寸的正方形
  68. /// </summary>
  69. /// <param name="content"></param>
  70. /// <param name="width"></param>
  71. /// <param name="height"></param>
  72. Texture2D GenerateQRImageWithColor(string content, int width, int height, Color color, out BitMatrix bitMatrix)
  73. {
  74. // 编码成color32
  75. MultiFormatWriter writer = new MultiFormatWriter();
  76. Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();
  77. //设置字符串转换格式,确保字符串信息保持正确
  78. hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
  79. // 设置二维码边缘留白宽度(值越大留白宽度大,二维码就减小)
  80. hints.Add(EncodeHintType.MARGIN, 1);
  81. hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.M);
  82. //实例化字符串绘制二维码工具
  83. bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  84. // 转成texture2d
  85. int w = bitMatrix.Width;
  86. int h = bitMatrix.Height;
  87. print(string.Format("w={0},h={1}", w, h));
  88. Texture2D texture = new Texture2D(w, h);
  89. for (int x = 0; x < h; x++)
  90. {
  91. for (int y = 0; y < w; y++)
  92. {
  93. if (bitMatrix[x, y])
  94. {
  95. texture.SetPixel(y, x, color);
  96. }
  97. else
  98. {
  99. texture.SetPixel(y, x, Color.white);
  100. }
  101. }
  102. }
  103. texture.Apply();
  104. 存储成文件
  105. //byte[] bytes = texture.EncodeToPNG();
  106. //string path = System.IO.Path.Combine(Application.dataPath, "qr.png");
  107. //System.IO.File.WriteAllBytes(path, bytes);
  108. return texture;
  109. }
  110. /// <summary>
  111. /// 生成2维码 方法三
  112. /// 在方法二的基础上,添加小图标
  113. /// </summary>
  114. /// <param name="content"></param>
  115. /// <param name="width"></param>
  116. /// <param name="height"></param>
  117. /// <returns></returns>
  118. Texture2D GenerateQRImageWithColorAndIcon(string content, int width, int height, Color color, Texture2D centerIcon)
  119. {
  120. BitMatrix bitMatrix;
  121. Texture2D texture = GenerateQRImageWithColor(content, width, height, color, out bitMatrix);
  122. int w = bitMatrix.Width;
  123. int h = bitMatrix.Height;
  124. // 添加小图
  125. int halfWidth = texture.width / 2;
  126. int halfHeight = texture.height / 2;
  127. int halfWidthOfIcon = centerIcon.width / 2;
  128. int halfHeightOfIcon = centerIcon.height / 2;
  129. int centerOffsetX = 0;
  130. int centerOffsetY = 0;
  131. for (int x = 0; x < h; x++)
  132. {
  133. for (int y = 0; y < w; y++)
  134. {
  135. centerOffsetX = x - halfWidth;
  136. centerOffsetY = y - halfHeight;
  137. if (Mathf.Abs(centerOffsetX) <= halfWidthOfIcon && Mathf.Abs(centerOffsetY) <= halfHeightOfIcon)
  138. {
  139. texture.SetPixel(x, y, centerIcon.GetPixel(centerOffsetX + halfWidthOfIcon, centerOffsetY + halfHeightOfIcon));
  140. }
  141. }
  142. }
  143. texture.Apply();
  144. // 存储成文件
  145. byte[] bytes = texture.EncodeToPNG();
  146. string path = System.IO.Path.Combine(Application.dataPath, "qr.png");
  147. System.IO.File.WriteAllBytes(path, bytes);
  148. return texture;
  149. }
  150. }

 

2、ZXingQRCodeWrapper_ScanQRCode

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using ZXing;
  6. public class ZXingQRCodeWrapper_ScanQRCode : MonoBehaviour
  7. {
  8. [Header("摄像机检测界面")]
  9. public RawImage cameraTexture;//摄像机映射显示区域
  10. public Text text;//用来显示扫描信息
  11. public Button scanningButton;
  12. private WebCamTexture webCamTexture;//摄像机映射纹理
  13. //二维码识别类
  14. BarcodeReader barcodeReader;//库文件的对象(二维码信息保存的地方)
  15. /// <summary>
  16. /// Start 初始化函数
  17. /// </summary>
  18. private void Start()
  19. {
  20. scanningButton.onClick.AddListener(ScanningButtonClick);
  21. }
  22. private void Update()
  23. {
  24. if (IsScanning)
  25. {
  26. //每隔一段时间进行一次识别二维码信息
  27. interval += Time.deltaTime;
  28. if (interval >= 3)
  29. {
  30. interval = 0;
  31. ScanQRCode();//开始扫描
  32. }
  33. }
  34. }
  35. /// <summary>
  36. /// 开启摄像机和准备工作
  37. /// </summary>
  38. void DeviceInit()
  39. {
  40. //1、获取所有摄像机硬件
  41. WebCamDevice[] devices = WebCamTexture.devices;
  42. //2、获取第一个摄像机硬件的名称
  43. string deviceName = devices[0].name;//手机后置摄像机
  44. //3、创建实例化一个摄像机显示区域
  45. webCamTexture = new WebCamTexture(deviceName, 400, 300);
  46. //4、显示的图片信息
  47. cameraTexture.texture = webCamTexture;
  48. //5、打开摄像机运行识别
  49. webCamTexture.Play();
  50. //6、实例化识别二维码信息存储对象
  51. barcodeReader = new BarcodeReader();
  52. }
  53. Color32[] data;//二维码图片信息以像素点颜色信息数组存放
  54. /// <summary>
  55. /// 识别摄像机图片中的二维码信息
  56. /// 打印二维码识别到的信息
  57. /// </summary>
  58. void ScanQRCode()
  59. {
  60. //7、获取摄像机画面的像素颜色数组信息
  61. data = webCamTexture.GetPixels32();
  62. //8、获取图片中的二维码信息
  63. Result result = barcodeReader.Decode(data, webCamTexture.width, webCamTexture.height);
  64. //如果获取到二维码信息了,打印出来
  65. if (result != null)
  66. {
  67. Debug.Log(result.Text);//二维码识别出来的信息
  68. text.text = result.Text;//显示扫描信息
  69. //扫描成功之后的处理
  70. IsScanning = false;
  71. webCamTexture.Stop();
  72. }
  73. }
  74. bool IsScanning = false;
  75. float interval = 0.5f;//扫描识别时间间隔
  76. void ScanningButtonClick()
  77. {
  78. DeviceInit();
  79. IsScanning = true;
  80. }
  81. }

 

3、ZXingQRCodeWrapper

  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using ZXing;
  4. using ZXing.Common;
  5. /// <summary>
  6. /// ZXing 二维码封装
  7. /// 1、二维码的生成
  8. /// 2、二维码的识别
  9. /// </summary>
  10. public class ZXingQRCodeWrapper
  11. {
  12. #region GenerateQRCode
  13. /*
  14. 使用方法,类似如下:
  15. ZXingQRCodeWrapper.GenerateQRCode("Hello Wrold!", 512, 512);
  16. ZXingQRCodeWrapper.GenerateQRCode("I Love You!", 256, 256, Color.red);
  17. ZXingQRCodeWrapper.GenerateQRCode("中间带图片的二维码图片", Color.green, icon);
  18. .......
  19. */
  20. /// <summary>
  21. /// 生成2维码 方法一
  22. /// </summary>
  23. /// <param name="content"></param>
  24. /// <returns></returns>
  25. public static Texture2D GenerateQRCode(string content) {
  26. return GenerateQRCode(content,256,256);
  27. }
  28. /// <summary>
  29. /// 生成2维码 方法一
  30. /// 经测试:只能生成256x256的
  31. /// </summary>
  32. /// <param name="content"></param>
  33. /// <param name="width"></param>
  34. /// <param name="height"></param>
  35. public static Texture2D GenerateQRCode(string content, int width, int height)
  36. {
  37. // 编码成color32
  38. EncodingOptions options = null;
  39. BarcodeWriter writer = new BarcodeWriter();
  40. options = new EncodingOptions
  41. {
  42. Width = width,
  43. Height = height,
  44. Margin = 1,
  45. };
  46. options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
  47. writer.Format = BarcodeFormat.QR_CODE;
  48. writer.Options = options;
  49. Color32[] colors = writer.Write(content);
  50. // 转成texture2d
  51. Texture2D texture = new Texture2D(width, height);
  52. texture.SetPixels32(colors);
  53. texture.Apply();
  54. return texture;
  55. }
  56. /// <summary>
  57. /// 生成2维码 方法二
  58. /// </summary>
  59. /// <param name="content"></param>
  60. /// <param name="color"></param>
  61. /// <returns></returns>
  62. public static Texture2D GenerateQRCode(string content,Color color)
  63. {
  64. return GenerateQRCode(content, 256, 256, color);
  65. }
  66. /// <summary>
  67. /// 生成2维码 方法二
  68. /// 经测试:能生成任意尺寸的正方形
  69. /// </summary>
  70. /// <param name="content"></param>
  71. /// <param name="width"></param>
  72. /// <param name="height"></param>
  73. /// <param name="color"></param>
  74. /// <returns></returns>
  75. public static Texture2D GenerateQRCode(string content, int width, int height, Color color)
  76. {
  77. BitMatrix bitMatrix;
  78. Texture2D texture = GenerateQRCode(content, width, height, color, out bitMatrix);
  79. return texture;
  80. }
  81. /// <summary>
  82. /// 生成2维码 方法二
  83. /// 经测试:能生成任意尺寸的正方形
  84. /// </summary>
  85. /// <param name="content"></param>
  86. /// <param name="width"></param>
  87. /// <param name="height"></param>
  88. public static Texture2D GenerateQRCode(string content, int width, int height, Color color, out BitMatrix bitMatrix)
  89. {
  90. // 编码成color32
  91. MultiFormatWriter writer = new MultiFormatWriter();
  92. Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();
  93. //设置字符串转换格式,确保字符串信息保持正确
  94. hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
  95. // 设置二维码边缘留白宽度(值越大留白宽度大,二维码就减小)
  96. hints.Add(EncodeHintType.MARGIN, 1);
  97. hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.M);
  98. //实例化字符串绘制二维码工具
  99. bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  100. // 转成texture2d
  101. int w = bitMatrix.Width;
  102. int h = bitMatrix.Height;
  103. Texture2D texture = new Texture2D(w, h);
  104. for (int x = 0; x < h; x++)
  105. {
  106. for (int y = 0; y < w; y++)
  107. {
  108. if (bitMatrix[x, y])
  109. {
  110. texture.SetPixel(y, x, color);
  111. }
  112. else
  113. {
  114. texture.SetPixel(y, x, Color.white);
  115. }
  116. }
  117. }
  118. texture.Apply();
  119. return texture;
  120. }
  121. /// <summary>
  122. /// 生成2维码 方法三
  123. /// 在方法二的基础上,添加小图标
  124. /// </summary>
  125. /// <param name="content"></param>
  126. /// <param name="color"></param>
  127. /// <param name="centerIcon"></param>
  128. /// <returns></returns>
  129. public static Texture2D GenerateQRCode(string content, Color color, Texture2D centerIcon)
  130. {
  131. return GenerateQRCode(content, 256, 256, color, centerIcon);
  132. }
  133. /// <summary>
  134. /// 生成2维码 方法三
  135. /// 在方法二的基础上,添加小图标
  136. /// </summary>
  137. /// <param name="content"></param>
  138. /// <param name="width"></param>
  139. /// <param name="height"></param>
  140. /// <returns></returns>
  141. public static Texture2D GenerateQRCode(string content, int width, int height, Color color, Texture2D centerIcon)
  142. {
  143. BitMatrix bitMatrix;
  144. Texture2D texture = GenerateQRCode(content, width, height, color, out bitMatrix);
  145. int w = bitMatrix.Width;
  146. int h = bitMatrix.Height;
  147. // 添加小图
  148. int halfWidth = texture.width / 2;
  149. int halfHeight = texture.height / 2;
  150. int halfWidthOfIcon = centerIcon.width / 2;
  151. int halfHeightOfIcon = centerIcon.height / 2;
  152. int centerOffsetX = 0;
  153. int centerOffsetY = 0;
  154. for (int x = 0; x < h; x++)
  155. {
  156. for (int y = 0; y < w; y++)
  157. {
  158. centerOffsetX = x - halfWidth;
  159. centerOffsetY = y - halfHeight;
  160. if (Mathf.Abs(centerOffsetX) <= halfWidthOfIcon && Mathf.Abs(centerOffsetY) <= halfHeightOfIcon)
  161. {
  162. texture.SetPixel(x, y, centerIcon.GetPixel(centerOffsetX + halfWidthOfIcon, centerOffsetY + halfHeightOfIcon));
  163. }
  164. }
  165. }
  166. texture.Apply();
  167. return texture;
  168. }
  169. #endregion
  170. #region ScanQRCode
  171. /*
  172. 使用方法,类似如下:
  173. Result result = ZXingQRCodeWrapper.ScanQRCode(data, webCamTexture.width, webCamTexture.height);
  174. */
  175. //二维码识别类
  176. static BarcodeReader barcodeReader;//库文件的对象(二维码信息保存的地方)
  177. /// <summary>
  178. /// 传入图片识别
  179. /// </summary>
  180. /// <param name="textureData"></param>
  181. /// <param name="textureDataWidth"></param>
  182. /// <param name="textureDataHeight"></param>
  183. /// <returns></returns>
  184. public static Result ScanQRCode(Texture2D textureData, int textureDataWidth, int textureDataHeight)
  185. {
  186. return ScanQRCode(textureData.GetPixels32(), textureDataWidth, textureDataHeight);
  187. }
  188. /// <summary>
  189. /// 传入图片像素识别
  190. /// </summary>
  191. /// <param name="textureData"></param>
  192. /// <param name="textureDataWidth"></param>
  193. /// <param name="textureDataHeight"></param>
  194. /// <returns></returns>
  195. public static Result ScanQRCode(Color32[] textureData, int textureDataWidth, int textureDataHeight) {
  196. if (barcodeReader==null)
  197. {
  198. barcodeReader = new BarcodeReader();
  199. }
  200. Result result = barcodeReader.Decode(textureData, textureDataWidth, textureDataHeight);
  201. return result;
  202. }
  203. #endregion
  204. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/715823
推荐阅读
相关标签
  

闽ICP备14008679号