最近项目遇到要生成二维码,来分享系统链接给其他用户,便查找这方面的资料,做一点读书笔记:
主要工作是用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: