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;