转自:http://blog.csdn.net/hasion/article/details/44653453
在Unity中,我们也可以实现二维码的制作,这需要借助Zxing的帮助,首先下载ZXing.Net。我这边下载的是ZXing.Net 0.14.0.0 大家可以点击这个链接直接下载:http://zxingnet.codeplex.com/downloads/get/824664 下载解压之后可以看到有一个unity文件夹,里面包含了三个文件。把文件夹拖到Unity工程中,在空物体上挂上下面这个脚本,即可生成对应的二维码。
- using UnityEngine;
- using System.Collections;
- using ZXing;
- using ZXing.QrCode;
- using System;
- using ZXing.Common;
- using ZXing.Rendering;
- using System.Collections.Generic;
- public class BarcodeCam : MonoBehaviour
- {
- public Texture2D encoded;
- void Start()
- {
- //设置二维码大小
- encoded = new Texture2D(512, 512);
- //二维码边框
- BitMatrix BIT;
- //设置二维码扫描结果
- string name = "http://www.baidu.com";
- Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();
- //设置编码方式
- hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
- BIT = new MultiFormatWriter().encode(name, BarcodeFormat.QR_CODE, 512, 512, hints);
- int width = BIT.Width;
- int height = BIT.Width;
- for (int x = 0; x < height; x++)
- {
- for (int y = 0; y < width; y++)
- {
- if (BIT[x, y])
- {
- encoded.SetPixel(y, x, Color.black);
- }
- else
- {
- encoded.SetPixel(y, x, Color.white);
- }
- }
- }
- encoded.Apply();
- }
- void OnGUI()
- {
- GUI.DrawTexture(new Rect(100, 100, 256, 256), encoded);
- }
- }
对于其中的MultiFormatWriter,以及BitMatrix他们具体用法,我们在封装好的dll中都可以找到。下面贴出他们的具体实现方法:
- // Generated by .NET Reflector from C:\Users\Win8_CX01\Desktop\dddd\Assets\unity\zxing.unity.dll
- namespace ZXing
- {
- using System;
- using System.Collections.Generic;
- using ZXing.Aztec;
- using ZXing.Common;
- using ZXing.Datamatrix;
- using ZXing.OneD;
- using ZXing.PDF417;
- using ZXing.QrCode;
- public sealed class MultiFormatWriter : Writer
- {
- private static readonly IDictionary<BarcodeFormat, Func<Writer>> formatMap;
- static MultiFormatWriter()
- {
- Dictionary<BarcodeFormat, Func<Writer>> dictionary = new Dictionary<BarcodeFormat, Func<Writer>>();
- dictionary.Add(BarcodeFormat.EAN_8, () => new EAN8Writer());
- dictionary.Add(BarcodeFormat.EAN_13, () => new EAN13Writer());
- dictionary.Add(BarcodeFormat.UPC_A, () => new UPCAWriter());
- dictionary.Add(BarcodeFormat.QR_CODE, () => new QRCodeWriter());
- dictionary.Add(BarcodeFormat.CODE_39, () => new Code39Writer());
- dictionary.Add(BarcodeFormat.CODE_128, () => new Code128Writer());
- dictionary.Add(BarcodeFormat.ITF, () => new ITFWriter());
- dictionary.Add(BarcodeFormat.PDF_417, () => new PDF417Writer());
- dictionary.Add(BarcodeFormat.CODABAR, () => new CodaBarWriter());
- dictionary.Add(BarcodeFormat.MSI, () => new MSIWriter());
- dictionary.Add(BarcodeFormat.PLESSEY, () => new PlesseyWriter());
- dictionary.Add(BarcodeFormat.DATA_MATRIX, () => new DataMatrixWriter());
- dictionary.Add(BarcodeFormat.AZTEC, () => new AztecWriter());
- formatMap = dictionary;
- }
- public BitMatrix encode(string contents, BarcodeFormat format, int width, int height)
- {
- return this.encode(contents, format, width, height, null);
- }
- public BitMatrix encode(string contents, BarcodeFormat format, int width, int height, IDictionary<EncodeHintType, object> hints)
- {
- if (!formatMap.ContainsKey(format))
- {
- throw new ArgumentException("No encoder available for format " + format);
- }
- return formatMap[format]().encode(contents, format, width, height, hints);
- }
- public static ICollection<BarcodeFormat> SupportedWriters
- {
- get
- {
- return formatMap.Keys;
- }
- }
- }
- }
- namespace ZXing.Common
- {
- using System;
- using System.Reflection;
- using System.Text;
- public sealed class BitMatrix
- {
- private readonly int[] bits;
- private readonly int height;
- private readonly int rowSize;
- private readonly int width;
- public BitMatrix(int dimension) : this(dimension, dimension)
- {
- }
- public BitMatrix(int width, int height)
- {
- if ((width < 1) || (height < 1))
- {
- throw new ArgumentException("Both dimensions must be greater than 0");
- }
- this.width = width;
- this.height = height;
- this.rowSize = (width + 0x1f) >> 5;
- this.bits = new int[this.rowSize * height];
- }
- private BitMatrix(int width, int height, int rowSize, int[] bits)
- {
- this.width = width;
- this.height = height;
- this.rowSize = rowSize;
- this.bits = bits;
- }
- public void clear()
- {
- int length = this.bits.Length;
- for (int i = 0; i < length; i++)
- {
- this.bits[i] = 0;
- }
- }
- public object Clone()
- {
- return new BitMatrix(this.width, this.height, this.rowSize, (int[]) this.bits.Clone());
- }
- public override bool Equals(object obj)
- {
- if (!(obj is BitMatrix))
- {
- return false;
- }
- BitMatrix matrix = (BitMatrix) obj;
- if (((this.width != matrix.width) || (this.height != matrix.height)) || ((this.rowSize != matrix.rowSize) || (this.bits.Length != matrix.bits.Length)))
- {
- return false;
- }
- for (int i = 0; i < this.bits.Length; i++)
- {
- if (this.bits[i] != matrix.bits[i])
- {
- return false;
- }
- }
- return true;
- }
- public void flip(int x, int y)
- {
- int index = (y * this.rowSize) + (x >> 5);
- this.bits[index] ^= ((int) 1) << x;
- }
- public int[] getBottomRightOnBit()
- {
- int index = this.bits.Length - 1;
- while ((index >= 0) && (this.bits[index] == 0))
- {
- index--;
- }
- if (index < 0)
- {
- return null;
- }
- int num2 = index / this.rowSize;
- int num3 = (index % this.rowSize) << 5;
- int num4 = this.bits[index];
- int num5 = 0x1f;
- while ((num4 >> num5) == 0)
- {
- num5--;
- }
- num3 += num5;
- return new int[] { num3, num2 };
- }
- public int[] getEnclosingRectangle()
- {
- int width = this.width;
- int height = this.height;
- int num3 = -1;
- int num4 = -1;
- for (int i = 0; i < this.height; i++)
- {
- for (int j = 0; j < this.rowSize; j++)
- {
- int num7 = this.bits[(i * this.rowSize) + j];
- if (num7 != 0)
- {
- if (i < height)
- {
- height = i;
- }
- if (i > num4)
- {
- num4 = i;
- }
- if ((j * 0x20) < width)
- {
- int num8 = 0;
- while ((num7 << (0x1f - num8)) == 0)
- {
- num8++;
- }
- if (((j * 0x20) + num8) < width)
- {
- width = (j * 0x20) + num8;
- }
- }
- if (((j * 0x20) + 0x1f) > num3)
- {
- int num9 = 0x1f;
- while ((num7 >> num9) == 0)
- {
- num9--;
- }
- if (((j * 0x20) + num9) > num3)
- {
- num3 = (j * 0x20) + num9;
- }
- }
- }
- }
- }
- int num10 = num3 - width;
- int num11 = num4 - height;
- if ((num10 < 0) || (num11 < 0))
- {
- return null;
- }
- return new int[] { width, height, num10, num11 };
- }
- public override int GetHashCode()
- {
- int width = this.width;
- width = (0x1f * width) + this.width;
- width = (0x1f * width) + this.height;
- width = (0x1f * width) + this.rowSize;
- foreach (int num2 in this.bits)
- {
- width = (0x1f * width) + num2.GetHashCode();
- }
- return width;
- }
- public BitArray getRow(int y, BitArray row)
- {
- if ((row == null) || (row.Size < this.width))
- {
- row = new BitArray(this.width);
- }
- else
- {
- row.clear();
- }
- int num = y * this.rowSize;
- for (int i = 0; i < this.rowSize; i++)
- {
- row.setBulk(i << 5, this.bits[num + i]);
- }
- return row;
- }
- public int[] getTopLeftOnBit()
- {
- int index = 0;
- while ((index < this.bits.Length) && (this.bits[index] == 0))
- {
- index++;
- }
- if (index == this.bits.Length)
- {
- return null;
- }
- int num2 = index / this.rowSize;
- int num3 = (index % this.rowSize) << 5;
- int num4 = this.bits[index];
- int num5 = 0;
- while ((num4 << (0x1f - num5)) == 0)
- {
- num5++;
- }
- num3 += num5;
- return new int[] { num3, num2 };
- }
- public void rotate180()
- {
- int width = this.Width;
- int height = this.Height;
- BitArray row = new BitArray(width);
- BitArray array2 = new BitArray(width);
- for (int i = 0; i < ((height + 1) / 2); i++)
- {
- row = this.getRow(i, row);
- array2 = this.getRow((height - 1) - i, array2);
- row.reverse();
- array2.reverse();
- this.setRow(i, array2);
- this.setRow((height - 1) - i, row);
- }
- }
- public void setRegion(int left, int top, int width, int height)
- {
- if ((top < 0) || (left < 0))
- {
- throw new ArgumentException("Left and top must be nonnegative");
- }
- if ((height < 1) || (width < 1))
- {
- throw new ArgumentException("Height and width must be at least 1");
- }
- int num = left + width;
- int num2 = top + height;
- if ((num2 > this.height) || (num > this.width))
- {
- throw new ArgumentException("The region must fit inside the matrix");
- }
- for (int i = top; i < num2; i++)
- {
- int num4 = i * this.rowSize;
- for (int j = left; j < num; j++)
- {
- this.bits[num4 + (j >> 5)] |= ((int) 1) << j;
- }
- }
- }
- public void setRow(int y, BitArray row)
- {
- Array.Copy(row.Array, 0, this.bits, y * this.rowSize, this.rowSize);
- }
- public override string ToString()
- {
- StringBuilder builder = new StringBuilder(this.height * (this.width + 1));
- for (int i = 0; i < this.height; i++)
- {
- for (int j = 0; j < this.width; j++)
- {
- builder.Append(this[j, i] ? "X " : " ");
- }
- builder.AppendLine("");
- }
- return builder.ToString();
- }
- public int Dimension
- {
- get
- {
- if (this.width != this.height)
- {
- throw new ArgumentException("Can't call getDimension() on a non-square matrix");
- }
- return this.width;
- }
- }
- public int Height
- {
- get
- {
- return this.height;
- }
- }
- public bool this[int x, int y]
- {
- get
- {
- int index = (y * this.rowSize) + (x >> 5);
- return (((this.bits[index] >> x) & 1) != 0);
- }
- set
- {
- if (value)
- {
- int index = (y * this.rowSize) + (x >> 5);
- this.bits[index] |= ((int) 1) << x;
- }
- }
- }
- public int Width
- {
- get
- {
- return this.width;
- }
- }
- }
- }