• 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);
    }

    }

  • 相关阅读:
    数据结构复习代码——栈的顺序实现以及一些基本操作
    数据结构复习代码——栈的顺序实现下的相关应用
    数据结构复习代码——线性表结构体定义,线性表动态内存分配的初始化以及元素插入
    数据结构复习代码——顺序结构下实现循环队列、基于顺寻存储串结构相关操作的实现
    数据结构复习代码——堆栈结构下串基本操作的实现
    数据结构复习代码——线性表合并
    数据结构小学期(温习温习。。。)(2021)——实现矩阵的加减乘、矩阵的逆、矩阵的特征值和特征值等运算
    clock moved backwards. Refusing to generate id for XX milliseconds.
    rsync实时备份监控命令(详细大全) rsync实时备份监控命令(详细大全)
    在Linux服务器上安装VNC并进行远程桌面连接
  • 原文地址:https://www.cnblogs.com/yanghui0702/p/yanghui20181113.html
Copyright © 2020-2023  润新知