• 二维码生成


    最近项目遇到要生成二维码,来分享系统链接给其他用户,便查找这方面的资料,做一点读书笔记:

    主要工作是用ThoughtWorks.QRCode.dll来实现的,ThoughtWorks.QRCode功能很强大,使用起来也很方便,

    下面是二维码原理的一个详细说明,我看了下,没有太难理解的算法,但涉及到的计算太多了,有兴趣的朋友,可以研究下

    http://developer.51cto.com/art/201310/414082_all.htm

    要生成二维码,最主要是使用类QRCodeEncoder,命名空间:ThoughtWorks.QRCode.Codec


    类的主要属性:

      public virtual Color QRCodeBackgroundColor { get; set; } //二维码背景颜色,默认为白色

      public virtual ENCODE_MODE QRCodeEncodeMode { get; set; }//默认为ENCODE_MODE.BYTE

      public virtual ERROR_CORRECTION QRCodeErrorCorrect { get; set; }//默认为ERROR_CORRECTION.M

      public virtual Color QRCodeForegroundColor { get; set; }//二维码码色,默认为黑色

      public virtual int QRCodeScale { get; set; }//放大比例,二维码中,最小黑块的大小,默认为4

      public virtual int QRCodeVersion { get; set; }//二维码版本,默认为7,取值范围0~40(包含0和40)(这个我觉得叫二维码大小更口语化些,二维码含有的信息量大小,由此属性决定,如果内容过长,会抛出数组越界的异常)

    定义了两个枚举:

    public enum ENCODE_MODE  //编码模式(我自己的理解,以下类同)
    
            {
                ALPHA_NUMERIC,
                NUMERIC,
                BYTE
            }
     
            public enum ERROR_CORRECTION  //(误差校正级别)
            {
                L,
                M,
                Q,
                H
            }

    最主要的两个方法:

    BiteMap Encode(string content);

    BiteMap Encode(string content, Encoding encoding);

    传入二维码的内容字符串,及编码方法。

    系统默认下会判断传入的content参数,如果传入的content属于Unicode字符,则系统默认采用Unicode编码,否则采用ASCII编码。

    网上有说是支持中文的,但我测试,默认情况下是不支持中文的,不知道是不是我的类库有问题,如果要支持中文,请请主动传递编码方式参数(utf8)。

    public virtual void setStructureappend(int m, int n, int p)

    //0<=N<=16&& 0<=M<=16 && 0<=P<=255时才有用,这个方法具体有什么用,我也没弄明白,有知道的朋友请指点下

    为了使用起来更方便点,我对这个类做了个简单的封装,主要修改了默认的编码为UTF8,修改可以根据传入的内容字节数自动判定QRCodeVersion ,修改了编码后返回类型为二维码图像的base64字符串

     1 public ErWeiMa()
     2         {
     3             _QRCode = new QRCodeEncoder();
     4             _QRCode.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
     5             _QRCode.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
     6             _QRCode.QRCodeScale = 4;
     7 
     8             encoding = Encoding.UTF8;
     9         }
    10 
    11 
    12  /// <summary>
    13         /// 获取二维码图像base64字符串,可直接赋值给img对象的src显示
    14         /// 默认编码UTF8,QRCodeEncoder默认值为Unicode
    15         /// </summary>
    16         /// <param name="content">编码内容</param>
    17         /// <returns>二维码图像base64字符串</returns>
    18         public string Encode(string content)
    19         {
    20             this.InitVersion(content);
    21             using(var ms = new MemoryStream())
    22             using (Bitmap image = _QRCode.Encode(content, encoding))
    23             {
    24                 image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    25                 return "data:image/jpeg;base64,"+ Convert.ToBase64String(ms.ToArray());
    26             }
    27         }
    28         /// <summary>
    29         /// 获取二维码图像base64字符串,可直接赋值给img对象的src显示
    30         /// </summary>
    31         /// <param name="content">编码内容</param>
    32         /// <param name="encoding">编码类型</param>
    33         /// <returns>二维码图像base64字符串</returns>
    34         public string Encode(string content,Encoding encoding)
    35         {
    36             this.encoding = encoding;
    37             this.InitVersion(content);
    38             using (var ms = new MemoryStream())
    39             using (Bitmap image = _QRCode.Encode(content, encoding))
    40             {
    41                 image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    42                 return "data:image/jpeg;base64," + Convert.ToBase64String(ms.ToArray());
    43             }
    44         }

    使用方法:

    1 ErWeiMa.ErWeiMa er = new ErWeiMa.ErWeiMa();
    2  this.img1.Src = er.Encode("中国");

    详细代码:

    http://pan.baidu.com/s/1nvCwlfj

    ThoughtWorks.QRCode.dll:

    http://pan.baidu.com/s/1c2zNrMS

    如果写的内容对你有所帮助,请帮我点个赞吧,你的鼓励是对我最大的支持和动力
  • 相关阅读:
    PHP: 深入pack/unpack
    gitlab add sshkey(包括第二个key)
    mysql insert与replace 性能
    python3 构造数据
    python 中matplotlib 绘图
    Anaconda安装方法
    永久解决IDEA 连接 mysql时区问题`
    输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理。
    给定字符串定义char *a = “I love China!”,读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串
    输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。
  • 原文地址:https://www.cnblogs.com/maerge/p/6443721.html
Copyright © 2020-2023  润新知