using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using ZXing;
using ZXing.QrCode;
public class BarcodeCam : MonoBehaviour
{
//二维码的纹理储存
private Texture2D encoded;
//显示在UI中的二维码
[Tooltip("放入一张rawimage的图片")]
public RawImage codeimage;
// 识别二维码使用的摄像头
private WebCamTexture camTexture;
// 线程
private Thread qrThread;
//颜色
private Color32[] c;
//宽高
private int W, H;
//屏幕的rect
private Rect screenRect;
//是否退出
private bool isQuit;
//最后得到的结果
[Tooltip("此处检测url,不必填写")]
public string LastResult;
//是否能够编码
private bool shouldEncodeNow;
//是否能够使用
private bool Isuse=false;
void OnGUI()
{
GUI.DrawTexture(screenRect, camTexture, ScaleMode.ScaleToFit);
}
#region 此方法是用于识别
/// <summary>
/// 此方法是用于识别
/// </summary>
void OnEnable()
{
if (camTexture != null)
{
// camTexture.Play();
W = camTexture.width;
H = camTexture.height;
}
}
void OnDisable()
{
if (camTexture != null)
{
camTexture.Pause();
}
}
void OnDestroy()
{
if(qrThread != null)
{
qrThread.Abort();
}
if(camTexture != null)
{
camTexture.Stop();
}
}
#endregion
/// <summary>
///程序退出
/// </summary>
void OnApplicationQuit()
{
isQuit = true;
}
/// <summary>
/// 更新
/// </summary>
void Update()
{
// encode the last found
//是否使用
if(Isuse)
{
//获取最后的url
var textForEncoding = LastResult;
//能够解码并且文本不为空
if (shouldEncodeNow && textForEncoding != null)
{
//获取制作后的二维码
var color32 = Encode(textForEncoding, encoded.width, encoded.height);
//像素设置
encoded.SetPixels32(color32);
//应用
encoded.Apply();
//二维码图片赋值
codeimage.GetComponent<RawImage>().texture = encoded;
//不用再次解析
shouldEncodeNow = false;
}
}
}
void DecodeQR()
{
// 创建一个自定义的读者源亮度
var barcodeReader = new BarcodeReader {AutoRotate = false, TryHarder = false};
while (true)
{
if (isQuit)
break;
try
{
// 解码当前帧
var result = barcodeReader.Decode(c, W, H);
//判断当前是否为空
if (result != null)
{
//获取结果文本
LastResult = result.Text;
//能够显示
shouldEncodeNow = true;
//网址
print(result.Text);
}
//睡眠一点和设置的信号获取下一帧
Thread.Sleep(200);
c = null;
}
catch
{
}
}
}
/// <summary>
/// 制作二维码
/// </summary>
/// <param name="textForEncoding"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
private static Color32[] Encode(string textForEncoding, int width, int height)
{
var writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new QrCodeEncodingOptions
{
Height = height,
Width = width
}
};
return writer.Write(textForEncoding);
}
/// <summary>
/// 改变最后的url
/// </summary>
/// <param name="str"></param>
public void ChangeLastResult(string str)
{
//能够使用为true
Isuse = true;
//设置纹理
encoded = new Texture2D(256, 256);
//获取最后的url
LastResult = str;
//现在就能够解码
shouldEncodeNow = true;
//screenRect = new Rect(0, 0, Screen.width, Screen.height);
//camTexture = new WebCamTexture();
//camTexture.requestedHeight = Screen.height; // 480;
//camTexture.requestedWidth = Screen.width; //640;
//OnEnable();
//开启线程
qrThread = new Thread(DecodeQR);
qrThread.Start();
}
}
Zxing这个本来是用来扫描二维码的功能,然后对代码进行了一定的修改,去掉WebCamTexture 的功能,用来实现同ing过url来实现在线生成二维码的功能,下面看一下如何实现的演示吧。
第一步:
创建一个Test的脚本,调用BarcodeCam类。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
public BarcodeCam barcode;
public string url = "https://www.baidu.com/";
void Start()
{
barcode.ChangeLastResult(url);
}
}
第二步:
生成一个Rawimage,为什么用Rawimage,这个是因为创建的二维码是texture2D,并不是sprite。
第三步:
相关的设置。
然后运行就能够得到一个百度的二维码了。