二維碼生成


最近項目遇到要生成二維碼,來分享系統鏈接給其他用戶,便查找這方面的資料,做一點讀書筆記:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM