二维码生成

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

主要工作是用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

posted @ 2017-02-26 10:27  马儿哥  阅读(1678)  评论(2编辑  收藏  举报