C#Qrcode生成二維碼支持中文,帶圖片,帶文字


C#Qrcode生成二維碼支持中文帶圖片的操作請看二樓的帖子,當然開始需要下載一下C#Qrcode的源碼 下載地址 : http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library,直接下載

然后需要修改一些代碼用於支持中文,修改代碼的時候會遇到可能遇到的問題
問題一(這個問題我遇到了):
調試Winform平台的例子時出現如下提 示:

Error'ThoughtWorks.QRCode.Properties.Resources' does not contain a definition for 'GetResource'

只要把這些出錯的地方改成:

MemoryStream memoryStream = new MemoryStream((byte[])Resources.ResourceManager.GetObject(fileName));

就可以了。
問題二:
調試WM版的示例程序在Encode時,出現IndexOutOfRangeException in rsTemp 的超出索引最大值異常,它在rsTemp[rsBlockNumber][j] = codewords[i2];這里拋出異常~
  
    原本我以為是程序邏輯出錯,后來經過對比桌面版和WM版的類庫,發現沒有錯啊,然后終於找到一個比較“笨”的解決方案:如下:
  我注意到,在QRCodeMobileLib項目下的QRCodeEncoder.cs類中,定義了個:
  [code=csharp]internal static String DATA_PATH = "qrcode_data";[/code]
  此行代碼在桌面版被注釋掉了,我猜是不是要把資源文件拷貝到WM程序的這個目錄下呢?好吧,於是動手,在QRCodeWindowsMobile5項目下建立一個新文件夾,名字是qrcode_data,然后再拷貝那些資源文件到此目錄。
  然后設置這些資源文件的生成動作為(復制,內容)好了,然后再重新調試一下,Encode~通過!
修改支持中文:
修改庫QRCodeLib中的類QRCodeEncoder.cs

public virtual Bitmap Encode(String content)
   {
   if (QRCodeUtility.IsUniCode(content))
   {
   return Encode(content, Encoding.Unicode);
   }
   else
   {
   return Encode(content, Encoding.ASCII);
   }
   }

public virtual Bitmap Encode(String content)
    {
    if (QRCodeUtility.IsUniCode(content))
    {
    return Encode(content, Encoding.GetEncoding("gb2312"));
    }
    else
    {
    return Encode(content, Encoding.ASCII);
    }
    }

對應的,QRCodeDecoder.cs類中的相應代碼也要改。這樣就中英文支持了。

擴展
  1.修改 QRCodeEncoder.cs 跟 QRCodeDecoder.cs
  Search一下,將 Encoding.Unicode 替換成 Encoding.UTF8
  
  2.修改 QRCodeUtility.cs

將 UnicodeEncoding encoding = new UnicodeEncoding();
改成 UTF8Encoding encoding = new UTF8Encoding();

相關使用代碼如下

QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
           String encoding = cboEncoding.Text ;
           if (encoding == "Byte") {
               qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
           } else if (encoding == "AlphaNumeric") {
               qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;            
           } else if (encoding == "Numeric") {
               qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;            
           }
           try {
               int scale = Convert.ToInt16(txtSize.Text);
               qrCodeEncoder.QRCodeScale = scale;
           } catch (Exception ex) {
               MessageBox.Show("Invalid size!");
               return;
           }
           try {
               int version = Convert.ToInt16(cboVersion.Text) ;
               qrCodeEncoder.QRCodeVersion = version;
           } catch (Exception ex) {
               MessageBox.Show("Invalid version !");
           }
 
           string errorCorrect = cboCorrectionLevel.Text;
           if (errorCorrect == "L")
               qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
           else if (errorCorrect == "M")
               qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
           else if (errorCorrect == "Q")
               qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
           else if (errorCorrect == "H")
               qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
 
           Image image;
           String data = txtEncodeData.Text;
           image = qrCodeEncoder.Encode(data);                      
           picEncode.Image = image;

 


免責聲明!

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



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