最近項目遇到要生成二維碼,來分享系統鏈接給其他用戶,便查找這方面的資料,做一點讀書筆記:
主要工作是用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: