生成二维码

作者:追风剑情 发布于:2019-10-29 16:26 分类:Unity3d

一、下载 ThoughtWorks.QRCode.dll放到Unity工程的Plugins目录下
1111.png
百度网盘下载 提取码 s786
PS: System.ComponentModel.dll和System.Drawing.dll在Unity的安装目录下就可以找到。

二、封装一个生成二维码的辅助类

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text;
  6. using System.Drawing;
  7. using System.Drawing.Imaging;
  8. using UnityEngine;
  9. using ThoughtWorks.QRCode.Codec;
  10.  
  11. /// <summary>
  12. /// 生成二维码辅助类 (仅考虑了Windows平台)
  13. /// 需要下载 ThoughtWorks.QRCode.dll
  14. /// </summary>
  15. public sealed class QRCodeHelper
  16. {
  17. /// <summary>
  18. /// 创建二维码Texture (Unity接口)
  19. /// </summary>
  20. /// <param name="content"></param>
  21. /// <param name="savePath"></param>
  22. /// <param name="fileName"></param>
  23. /// <returns></returns>
  24. public static Texture2D CreateQRcodeTexture(string content, string savePath, string fileName = "qrcode")
  25. {
  26. Bitmap bitmap = CreateQRCode(content);
  27. int width = bitmap.Width;
  28. int height = bitmap.Height;
  29. MemoryStream ms = new MemoryStream();
  30. /*
  31. * 当程序发布后需要手动拷贝{Unity安装目录}\Editor\Data\MonoBleedingEdge\lib\mono\4.5\System.Drawing.dll
  32. * 到{项目发布目录}\XXXXX_Data\Managed\System.Drawing.dll(替换此dll),否则Save()方法会报错。
  33. */
  34. bitmap.Save(ms, bitmap.RawFormat);
  35. byte[] bytes = ms.ToArray();
  36.  
  37. // 保存到磁盘则不需要替换System.Drawing.dll
  38. //bitmap.Save("tmp.png", ImageFormat.Png);
  39. //byte[] bytes = File.ReadAllBytes("tmp.png");
  40.  
  41. Texture2D tex = new Texture2D(width, height, TextureFormat.RGBA32, false);
  42. tex.LoadImage(bytes);
  43. tex.Apply();
  44.  
  45. return tex;
  46. }
  47.  
  48. /// <summary>
  49. /// 创建并保存二维码图片
  50. /// </summary>
  51. /// <param name="content"></param>
  52. /// <param name="savePath"></param>
  53. /// <param name="fileName"></param>
  54. public static void CreateQRcode(string content, string savePath, string fileName="qrcode")
  55. {
  56. Bitmap bitmap = CreateQRCode(content);
  57. SaveQRCode(bitmap, savePath, fileName);
  58. }
  59.  
  60. /// <summary>
  61. /// 创建二维码 (C#接口)
  62. /// </summary>
  63. /// <param name="content">内容</param>
  64. /// <returns></returns>
  65. public static Bitmap CreateQRCode(string content)
  66. {
  67. try
  68. {
  69. QRCodeEncoder qrEncoder = new QRCodeEncoder();
  70. //二维码类型
  71. qrEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
  72. //二维码尺寸
  73. qrEncoder.QRCodeScale = 4;
  74. //二维码版本
  75. qrEncoder.QRCodeVersion = 7;
  76. //二维码容错程度
  77. qrEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
  78. //字体与背景颜色
  79. qrEncoder.QRCodeBackgroundColor = System.Drawing.Color.White;
  80. qrEncoder.QRCodeForegroundColor = System.Drawing.Color.Black;
  81. //UTF-8编码类型
  82. Bitmap qrcode = qrEncoder.Encode(content, Encoding.UTF8);
  83.  
  84. return qrcode;
  85. }
  86. catch (Exception)
  87. {
  88. return null;
  89. }
  90. }
  91.  
  92. /// <summary>
  93. /// 保存二维码 (C#接口)
  94. /// </summary>
  95. /// <param name="QRCode">二维码图片</param>
  96. /// <param name="SavePath">保存路径</param>
  97. /// <param name="QRCodeName">图片名称</param>
  98. public static void SaveQRCode(Bitmap QRCode, string SavePath, string QRCodeName)
  99. {
  100. if (!Directory.Exists(SavePath))
  101. {
  102. Directory.CreateDirectory(SavePath);
  103. }
  104. QRCode.Save(Path.Combine(SavePath, QRCodeName + ".png"), ImageFormat.Png);
  105.  
  106. QRCode.Dispose();
  107. }
  108. }

测试效果

222.png

如果将Bitmap保存到内存流,必须用{Unity安装目录}下的System.Drawing.dll替换{发布目录}下的同名dll,否则调用Bitmap.Save()方法时会报如下错:

NullReferenceException: Object reference not set to an instance of an object
  at System.Drawing.ComIStreamMarshaler+ManagedToNativeWrapper..cctor () [0x00049] in <868bfedd9fd649b7a5aa185d8ce8619b>:0 
Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception.
  at System.Drawing.ComIStreamMarshaler.MarshalManagedToNative (System.Object managedObj) [0x00000] in <868bfedd9fd649b7a5aa185d8ce8619b>:0 
  at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipSaveImageToStream(System.Runtime.InteropServices.HandleRef,
System.Runtime.InteropServices.ComTypes.IStream,System.Guid&,System.Runtime.InteropServices.HandleRef)

  at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageCodecInfo encoder, System.Drawing.Imaging.EncoderParameters encoderParams) [0x0007e] in <868bfedd9fd649b7a5aa185d8ce8619b>:0 
  at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageFormat format) [0x00029] in <868bfedd9fd649b7a5aa185d8ce8619b>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Image.Save(System.IO.Stream,System.Drawing.Imaging.ImageFormat)

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号