Unity3D结合ZXing生成中间带图标的二维码并保存

1、环境
Win10
Unity3d 2017.1.0f3 及以上版本
ZXing.Net ZXing.Net.0.16.0.0
下载:http://zxingnet.codeplex.com/

本人ZXing插件链接如下:

链接: https://pan.baidu.com/s/1Fv09is9IwQT6T07aAa5NnA 提取码:xha0 

2、效果截图


3、代码
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using ZXing;
using ZXing.Common;

public class Demo : MonoBehaviour {

public RawImage img1;
public RawImage img2;
public RawImage img3;
public Texture2D icon;

void Start ()
{
GenerateQRImage1("Hello Wrold!", 256, 256);
GenerateQRImage2("I Love You!", 256, 256);
GenerateQRImage3("中间带图片的二维码图片", 256, 256, icon);
}

/// <summary>
/// 生成2维码 方法一
/// 经测试:只能生成256x256的
/// </summary>
/// <param name="content"></param>
/// <param name="width"></param>
/// <param name="height"></param>
void GenerateQRImage1(string content, int width, int height)
{
// 编码成color32
EncodingOptions options = null;
BarcodeWriter writer = new BarcodeWriter();
options = new EncodingOptions
{
Width = width,
Height = height,
Margin = 1,
};
options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
writer.Format = BarcodeFormat.QR_CODE;
writer.Options = options;
Color32[] colors = writer.Write(content);

// 转成texture2d
Texture2D texture = new Texture2D(width, height);
texture.SetPixels32(colors);
texture.Apply();
img1.texture = texture;
//// 存储成文件
//byte[] bytes = texture.EncodeToPNG();
//string path = System.IO.Path.Combine(Application.dataPath, "qr.png");
//System.IO.File.WriteAllBytes(path, bytes);
}

/// <summary>
/// 生成2维码 方法二
/// 经测试:能生成任意尺寸的正方形
/// </summary>
/// <param name="content"></param>
/// <param name="width"></param>
/// <param name="height"></param>
void GenerateQRImage2(string content, int width, int height)
{
// 编码成color32
MultiFormatWriter writer = new MultiFormatWriter();
Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();
hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.Add(EncodeHintType.MARGIN, 1);
hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.M);
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);

// 转成texture2d
int w = bitMatrix.Width;
int h = bitMatrix.Height;
print(string.Format("w={0},h={1}", w, h));
Texture2D texture = new Texture2D(w, h);
for (int x=0; x<h; x++)
{
for(int y=0; y<w; y++)
{
if(bitMatrix[x,y])
{
texture.SetPixel(y, x, Color.red);
}
else
{
texture.SetPixel(y, x, Color.white);
}
}
}
texture.Apply();
img2.texture = texture;
//// 存储成文件
//byte[] bytes = texture.EncodeToPNG();
//string path = System.IO.Path.Combine(Application.dataPath, "qr.png");
//System.IO.File.WriteAllBytes(path, bytes);
}

/// <summary>
/// 生成2维码 方法三
/// 在方法二的基础上,添加小图标
/// </summary>
/// <param name="content"></param>
/// <param name="width"></param>
/// <param name="height"></param>
void GenerateQRImage3(string content, int width, int height, Texture2D centerIcon)
{
// 编码成color32
MultiFormatWriter writer = new MultiFormatWriter();
Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();
hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.Add(EncodeHintType.MARGIN, 1);
hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);

// 转成texture2d
int w = bitMatrix.Width;
int h = bitMatrix.Height;
Texture2D texture = new Texture2D(w, h);
for (int x = 0; x < h; x++)
{
for (int y = 0; y < w; y++)
{
if (bitMatrix[x, y])
{
texture.SetPixel(y, x, Color.blue);
}
else
{
texture.SetPixel(y, x, Color.white);
}
}
}
// 添加小图
int halfWidth = texture.width / 2;
int halfHeight = texture.height / 2;
int halfWidthOfIcon = centerIcon.width / 2;
int halfHeightOfIcon = centerIcon.height / 2;
int centerOffsetX = 0;
int centerOffsetY = 0;
for (int x = 0; x < h; x++)
{
for (int y = 0; y < w; y++)
{
centerOffsetX = x - halfWidth;
centerOffsetY = y - halfHeight;
if(Mathf.Abs(centerOffsetX) <= halfWidthOfIcon && Mathf.Abs(centerOffsetY) <= halfHeightOfIcon)
{
texture.SetPixel(x, y, centerIcon.GetPixel(centerOffsetX + halfWidthOfIcon, centerOffsetY + halfHeightOfIcon));
}
}
}
texture.Apply();
img3.texture = texture;
// 存储成文件
byte[] bytes = texture.EncodeToPNG();
string path = System.IO.Path.Combine(Application.dataPath, "qr.png");
System.IO.File.WriteAllBytes(path, bytes);
}

}

posted @ 2018-11-13 10:36  IT_yanghui  阅读(1514)  评论(0编辑  收藏  举报