標籤:des style blog http color 使用 os io
二維碼的製作主要是引用第三方的程式集ThoughtWorks.QRCode.dll,調用QRCodeEncoder的Encode方法得到一個Bitmap圖;相反,解析二維碼就是用的Decode方法。
如下樣本產生二維碼的方法:
/// <summary> /// 產生不帶logo的二維碼圖片 /// </summary> /// <param name="data">要產生二維碼的字串</param> /// <returns></returns> public System.Drawing.Image GCode(String data) { QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); String encoding = cboEncoding.Text;//QRCodeEncodeMode是枚舉類型,此處是使用ComboBox給使用者自行選擇 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) { MessageBox.Show("Invalid size!"); return null; } try { int version = Convert.ToInt16(cboVersion.Text); qrCodeEncoder.QRCodeVersion = version;//版本 } catch (Exception) { 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 pbImg = qrCodeEncoder.Encode(data); return pbImg; }
如果要產生一個中間帶一個小圖片的二維碼,則需要使用GDI+將圖片畫到已經產生的二維碼圖片上(注意,中間小圖片的大小要控制好,否則可能會遮擋二維碼有效資訊,導致讀不出來,):
/// <summary> /// 產生帶logo二維碼的圖片 /// </summary> /// <param name="imgBack">背景圖片</param> /// <param name="destImg">logo圖片</param> /// <returns></returns> public static System.Drawing.Image CombinImage(System.Drawing.Image imgBack, string destImg) { if (imgBack == null)//如果二維碼產生出錯 { return null; } try { System.Drawing.Image img = System.Drawing.Image.FromFile(destImg);//拿到logo圖片 if (img.Height != 50 || img.Width != 50) { img = KiResizeImage(img, 50, 50);//調整logo圖片大小 } Graphics g = Graphics.FromImage(imgBack); g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Height / 2 - img.Height / 2, img.Width, img.Height);//把logo畫到二維碼上 GC.Collect(); return imgBack; } catch (Exception ex) { MessageBox.Show("Logo image error!");//如果選擇的Logo圖片未擷取到,則拋出異常 return null; } } /// <summary> /// 調整logo圖片的大小 /// </summary> /// <param name="bmp">logo圖片</param> /// <param name="newW">寬</param> /// <param name="newH">高</param> /// <returns>返回處理好的圖片</returns> public static System.Drawing.Image KiResizeImage(System.Drawing.Image bmp, int newW, int newH) { try { System.Drawing.Image b = new Bitmap(newW, newH);//建立一個空白圖片 Graphics g = Graphics.FromImage(b);//把b圖片當做背景建立畫布 g.InterpolationMode = InterpolationMode.HighQualityBicubic; // 插值演算法的品質 g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);//把圖片按比例畫到畫布上 g.Dispose(); return b; } catch { return null; } }View Code
好了,對於二維碼的製作和解析,以上內容對於使用者基本夠用了,如果感興趣的話,可以使用Reflector反編譯查看ThoughtWorks.QRCode.dll內部到底是如何?的