Files
tianrunCRM/Assets/3rd/ZXing/BarcodeCam.cs
2020-07-04 14:41:25 +08:00

171 lines
4.1 KiB
C#

/*
* Copyright 2012 ZXing.Net authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Threading;
using UnityEngine;
using ZXing;
using ZXing.QrCode;
public class BarcodeCam : MonoBehaviour
{
public BarcodeCam self;
// Texture for encoding test
public Texture2D encoded;
private WebCamTexture camTexture;
private Thread qrThread;
private Color32[] color32;
private int W, H;
private Rect screenRect;
private bool isQuit;
public string LastResult;
private bool shouldEncodeNow;
public BarcodeCam()
{
self = this;
}
void Start()
{
encoded = new Texture2D(256, 256);
LastResult = "http://www.google.com";
shouldEncodeNow = true;
screenRect = new Rect(Screen.width * 0.1f/2, -Screen.height * 0.2f/2, Screen.width*0.9f, Screen.height*0.8f);
camTexture = new WebCamTexture();
camTexture.requestedHeight = Screen.height; // 480;
camTexture.requestedWidth = Screen.width; //640;
OnEnable();
qrThread = new Thread(DecodeQR);
qrThread.Start();
}
void OnGUI()
{
GUI.DrawTexture(screenRect, camTexture, ScaleMode.ScaleToFit);
}
void OnEnable()
{
if (camTexture != null)
{
camTexture.Play();
W = camTexture.width;
H = camTexture.height;
if (color32 == null)
{
color32 = camTexture.GetPixels32();
}
}
}
void OnDisable()
{
if (camTexture != null)
{
camTexture.Pause();
}
}
void OnDestroy()
{
if(qrThread != null)
qrThread.Abort();
if(camTexture != null)
camTexture.Stop();
}
// It's better to stop the thread by itself rather than abort it.
void OnApplicationQuit()
{
isQuit = true;
}
//void Update()
//{
// encode the last found
// var textForEncoding = LastResult;
// if (shouldEncodeNow &&
// textForEncoding != null)
// {
// var c = Encode(textForEncoding, encoded.width, encoded.height);
// encoded.SetPixels32(c);
// encoded.Apply();
// shouldEncodeNow = false;
// }
//}
void DecodeQR()
{
// create a reader with a custom luminance source
var barcodeReader = new BarcodeReader { AutoRotate = false, TryHarder = false };
while (true)
{
if (isQuit)
break;
try
{
if (color32 != null)
{
// decode the current frame
var result = barcodeReader.Decode(color32, W, H);
if (result != null)
{
LastResult = result.Text;
shouldEncodeNow = true;
print(result.Text);
}
}
// Sleep a little bit and set the signal to get the next frame
Thread.Sleep(200);
color32 = null;
}
catch(System.Exception e)
{
Debug.LogError(e);
}
}
}
public 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);
}
}