此文件是在MVC中使用ThoughtWorks.QRCode生成網頁版二維碼需下載dll文件,可帶Logo標志 下載地址
項目中需引用此dll文件,而文件中需導入
using ThoughtWorks.QRCode.Codec; using ThoughtWorks.QRCode.Codec.Data; using ThoughtWorks.QRCode.Codec.Util; using System.Drawing.Drawing2D; using System.Drawing; using System.Text;
//生成二維碼方法一
//傳入要生成二維碼的字符串nr private void CreateCode_Simple(string nr) { //創建二維碼生成類 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); //設置編碼模式 qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; //設置編碼測量度最大40 qrCodeEncoder.QRCodeScale = 4; //設置編碼版本 qrCodeEncoder.QRCodeVersion = 8; //設置編碼錯誤糾正 qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; //System.Drawing.Image image = qrCodeEncoder.Encode("330326 浙江"); //根據字符串生成二維碼圖片System.Text.Encoding.UTF8方式編碼支持中文 System.Drawing.Image image = qrCodeEncoder.Encode(nr, System.Text.Encoding.UTF8); //圖片文件命名以日期時間格式或用Guid(string guid = Guid.NewGuid().ToString().Replace("-", "") + ".png";) string filename = DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".jpg"; //保存路徑及文件名 string filepath = Server.MapPath(@"~\Upload") + "\\" + filename;
//從數據流中讀取數據 System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); //保存路徑及文件名大圖小圖組合成一張圖 CombinImage(image,Server.MapPath("~/images/3.jpg")).Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); fs.Close(); image.Dispose(); //二維碼解碼 var codeDecoder = CodeDecoder(filepath); }
/// <summary> /// 調用此函數后使此兩種圖片合並,類似相冊,有個 /// 背景圖,中間貼自己的目標圖片 /// </summary> /// <param name="imgBack">粘貼的源圖片大圖</param> /// <param name="destImg">粘貼的目標圖片小圖</param> public static Image CombinImage(Image imgBack, string destImg) { Image img = Image.FromFile(destImg); //Logo圖片 //logo占二維碼圖片尺寸為30%比例 img = KiResizeImage(img, imgBack.Width * 3 / 10, imgBack.Height * 3 / 10, 0); Graphics g = Graphics.FromImage(imgBack); g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框寬, 相框高); //g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一層黑色邊框 //g.DrawImage(img, 照片與相框的左邊距, 照片與相框的上邊距, 照片寬, 照片高); g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height); GC.Collect(); return imgBack; }
/// <summary> /// Resize圖片 /// </summary> /// <param name="bmp">原始Bitmap</param> /// <param name="newW">新的寬度</param> /// <param name="newH">新的高度</param> /// <param name="Mode">保留着,暫時未用</param> /// <returns>處理以后的圖片</returns> public static Image KiResizeImage(Image bmp, int newW, int newH, int Mode) { try { Image b = new Bitmap(newW, newH); Graphics g = Graphics.FromImage(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; } }
/// <summary> /// 生成二維碼 /// </summary> /// <param name="strData">要生成的文字或者數字,支持中文。如: "330326 浙江 或者:111111"</param> /// <param name="qrEncoding">三種尺寸:BYTE ,ALPHA_NUMERIC,NUMERIC</param> /// <param name="level">大小:L M Q H</param> /// <param name="version">版本:如 8</param> /// <param name="scale">比例:如 4</param> /// <returns></returns> public ActionResult CreateCode_Choose(string strData, string qrEncoding, string level, int version, int scale) { QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); string encoding = qrEncoding; switch (encoding) { case "Byte": qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; break; case "AlphaNumeric": qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC; break; case "Numeric": qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC; break; default: qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; break; } qrCodeEncoder.QRCodeScale = scale; qrCodeEncoder.QRCodeVersion = version; switch (level) { case "L": qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L; break; case "M": qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; break; case "Q": qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q; break; default: qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H; break; } //文字生成圖片 Image image = qrCodeEncoder.Encode(strData, System.Text.Encoding.UTF8); string filename = DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".jpg"; string filepath = Server.MapPath(@"~\Upload") + "\\" + filename; //如果文件夾不存在,則創建 //if (!Directory.Exists(filepath)) // Directory.CreateDirectory(filepath); System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); CombinImage(image, Server.MapPath("~/images/3.jpg")).Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); fs.Close(); image.Dispose(); return Content(@"/Upload/" + filename); }
/// <summary> /// 二維碼解碼 /// </summary> /// <param name="filePath">圖片路徑</param> /// <returns></returns> public string CodeDecoder(string filePath) { if (!System.IO.File.Exists(filePath)) return null; Bitmap myBitmap = new Bitmap(Image.FromFile(filePath)); QRCodeDecoder decoder = new QRCodeDecoder(); string decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap)); return decodedString; }
