每次寫博客,第一句話都是這樣的:程序員很苦逼,除了會寫程序,還得會寫博客!當然,希望將來的一天,某位老板看到此博客,給你的程序員職工加點薪資吧!因為程序員的世界除了苦逼就是沉默。我眼中的程序員大多都不愛說話,默默承受着編程的巨大壓力,除了技術上的交流外,他們不願意也不擅長和別人交流,更不樂意任何人走進他們的內心!
廢話少說,咱直接進入正題:
目前來說,比較流行的二維碼生成方式有兩種:一種是:QrCode.Net和谷歌的Zxing.Net,我個人比較傾向於使用ZXing.Net,今天本篇博客主要講解Zxing.Net的使用。
本篇我會把QrCode.Net的代碼和Zxing.Net的代碼貼下來。其中QrCode.Net的官方網址為:http://qrcodenet.codeplex.com/ Zxing的官方網址為:http://zxingnet.codeplex.com/ 可通過官網,把dll文件下載下來,然后作為項目引用。當然,老外(外語)寫的東東,看不懂也沒什么,做到會用就行啦!
首先粘貼下關於QrCode.Net的代碼(此代碼沒做驗證,有興趣的小虎斑可以自行測試),如下:
1、項目需要引用:Gma.QrCodeNet.Encoding.Net45 在官網上下載,我是VS12開發的,所以版本是4.5
代碼如下:
#region QrCode.Net //生成二維碼 static void Generate1(string url) { //創建二維碼生成類 QrEncoder qrEncoder = new QrEncoder(); QrCode qrCode = qrEncoder.Encode(url); //輸出顯示在控制台 for (int j = 0; j < qrCode.Matrix.Height; j++) { for (int i = 0; i < qrCode.Matrix.Width; i++) { char charToPoint = qrCode.Matrix[i, j] ? '█' : ' '; Console.Write(charToPoint); } Console.WriteLine(); } } //生成圖片 static void Generate2(string url) { QrEncoder qrEncoder = new QrEncoder(); QrCode qrCode = qrEncoder.Encode(url); //保存成png文件 string filename = @"H:\桌面\截圖\url.png"; GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White); using (FileStream stream = new FileStream(filename, FileMode.Create)) { render.WriteToStream(qrCode.Matrix, ImageFormat.Png, stream); } } //生成中文二維碼-支持中文 static void Generate3() { QrEncoder qrEncoder = new QrEncoder(); QrCode qrCode = qrEncoder.Encode("我是小天馬"); //保存成png文件 string filename = @"H:\桌面\截圖\cn.png"; GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White); Bitmap map = new Bitmap(500, 500); Graphics g = Graphics.FromImage(map); g.FillRectangle(Brushes.Red, 0, 0, 500, 500); render.Draw(g, qrCode.Matrix, new Point(20, 20)); map.Save(filename, ImageFormat.Png); } //設置二維碼大小 static void Generate4() { QrEncoder qrEncoder = new QrEncoder(); QrCode qrCode = qrEncoder.Encode("我是小天馬"); //保存成png文件 string filename = @"H:\桌面\截圖\size.png"; //ModuleSize 設置圖片大小 //QuietZoneModules 設置周邊padding /* * 5----150*150 padding:5 * 10----300*300 padding:10 */ GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(10, QuietZoneModules.Two), Brushes.Black, Brushes.White); Point padding = new Point(10, 10); DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width); Bitmap map = new Bitmap(dSize.CodeWidth + padding.X, dSize.CodeWidth + padding.Y); Graphics g = Graphics.FromImage(map); render.Draw(g, qrCode.Matrix, padding); map.Save(filename, ImageFormat.Png); } //生成帶Logo的二維碼 static void Generate5() { QrEncoder qrEncoder = new QrEncoder(); QrCode qrCode = qrEncoder.Encode("我是小天馬"); //保存成png文件 string filename = @"H:\桌面\截圖\logo.png"; GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White); DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width); Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth); Graphics g = Graphics.FromImage(map); render.Draw(g, qrCode.Matrix); //追加Logo圖片 ,注意控制Logo圖片大小和二維碼大小的比例 Image img = Image.FromFile(@"F:\JavaScript_Solution\QrCode\QrCode\Images\101.jpg"); Point imgPoint = new Point((map.Width - img.Width) / 2, (map.Height - img.Height) / 2); g.DrawImage(img, imgPoint.X, imgPoint.Y, img.Width, img.Height); map.Save(filename, ImageFormat.Png); } #endregion
以上代碼本人並未測試,有興趣的小虎斑可以自行測試哈!
下面說說Zxing.Net的使用,在說這個之前,本人先將做出來的東東粘貼給大家看
生成的二維碼如下:
普通二維碼:
帶有logo的二維碼:
其中Logo為:
彩色二維碼(大家可根據需要,自行定制):
好了,牛也吹了,不能不上代碼啊,那下面咱們來觀摩下代碼(別忘了引用Zxing.dll,沒有的話,去官網下載哈):
class Program { static void Main(string[] args) { //生成帶有logo的二維碼 string Pth = Environment.CurrentDirectory; string LogoPth =Pth + "//logo.jpg"; string serverPth = Pth + "//" + DateTime.Now.ToString("yyyy-MM-dd") + ".Jpeg"; Generate("http://www.baidu.com", LogoPth, serverPth, ImageFormat.Jpeg); //基礎版本 Bitmap BT = GenByZXingNet_Color("Yolanda"); string baseEWM = Pth + "//base_ErWeiMa.png"; BT.Save(baseEWM, System.Drawing.Imaging.ImageFormat.Png); //條形碼 string TXMpth = Pth + "//TXM.png"; Generate("Yolanda", TXMpth, ImageFormat.Png); //讀取二維碼條形碼 string K = Read(TXMpth); string H = Read(serverPth); Console.WriteLine(K+" "+H); Console.Read(); } #region C#生成二維碼-基礎版本 //需要引用ZXing.DLL 可以百度一下 一個很好用的二維碼生成程序集《DLL文件啦》 //使用案例:Bitmap img3 = GenByZXingNet(""); //使用案例:img3.Save(Server.MapPath(@"\testImg\erweima.png")); /// <summary> /// 生成二維碼 /// </summary> /// <param name="msg">二維碼信息</param> /// <param name="codeSizeInPixels">正方形 邊長</param> /// <returns>圖片</returns> public static Bitmap GenByZXingNet(string msg,int codeSizeInPixels = 250) { BarcodeWriter writer = new BarcodeWriter(); writer.Format = BarcodeFormat.QR_CODE; writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//編碼問題 writer.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H); writer.Options.Height = writer.Options.Width = codeSizeInPixels; writer.Options.Margin = 0;//設置邊框1 ZXing.Common.BitMatrix bm = writer.Encode(msg); Bitmap img = writer.Write(msg); return img; } #endregion #region C#生成帶有Log的二維碼 /// <summary> /// 生成帶Logo的二維碼 /// </summary> /// <param name="text">文本內容</param> static void Generate(string text, string LogoPth, string serverPth, ImageFormat imgFrt) { //Logo 圖片 Bitmap logo = new Bitmap(LogoPth); //構造二維碼寫碼器 MultiFormatWriter writer = new MultiFormatWriter(); Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>(); hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8"); hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //生成二維碼 BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, 300, 300, hint); BarcodeWriter barcodeWriter = new BarcodeWriter(); Bitmap map = barcodeWriter.Write(bm); //獲取二維碼實際尺寸(去掉二維碼兩邊空白后的實際尺寸) int[] rectangle = bm.getEnclosingRectangle(); //計算插入圖片的大小和位置 int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width); int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height); int middleL = (map.Width - middleW) / 2; int middleT = (map.Height - middleH) / 2; //將img轉換成bmp格式,否則后面無法創建Graphics對象 Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb); using (Graphics g = Graphics.FromImage(bmpimg)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.DrawImage(map, 0, 0); } //將二維碼插入圖片 Graphics myGraphic = Graphics.FromImage(bmpimg); //白底 myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH); myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH); //保存成圖片 bmpimg.Save(serverPth, imgFrt); } #endregion #region ZXing生成條形碼 /// <summary> /// 文本內容 /// </summary> /// <param name="text">只支持數字 只支持偶數個 最大長度80</param> /// <param name="ServerPTh">存儲路徑 @"H:\桌面\截圖\generate2.png"</param> static void Generate(string text,string ServerPth,ImageFormat imgFrt) { BarcodeWriter writer = new BarcodeWriter(); //使用ITF 格式,不能被現在常用的支付寶、微信掃出來 //如果想生成可識別的可以使用 CODE_128 格式 //writer.Format = BarcodeFormat.ITF; writer.Format = BarcodeFormat.CODE_128; EncodingOptions options = new EncodingOptions() { Width = 150, Height = 50, Margin = 2 }; writer.Options = options; Bitmap map = writer.Write(text); string filename = ServerPth;//請注意 保存格式和文件擴展名一致性 map.Save(filename, imgFrt); } #endregion #region 二維碼 條形碼讀取 /// <summary> /// 二維碼 條形碼讀取 /// </summary> /// <param name="filename">文件路徑</param> /// <returns></returns> static string Read(string filename) { BarcodeReader reader = new BarcodeReader(); reader.Options.CharacterSet = "UTF-8"; Bitmap map = new Bitmap(filename); Result result = reader.Decode(map); return result == null ? "" : result.Text; } #endregion #region C#生成特定顏色二維碼-基礎版本 //需要引用ZXing.DLL 可以百度一下 一個很好用的二維碼生成程序集《DLL文件啦》 //使用案例:Bitmap img3 = GenByZXingNet(""); //使用案例:img3.Save(Server.MapPath(@"\testImg\erweima.png")); /// <summary> /// 生成二維碼 /// </summary> /// <param name="msg">二維碼信息</param> /// <param name="codeSizeInPixels">正方形 邊長</param> /// <returns>圖片</returns> public static Bitmap GenByZXingNet_Color(string msg, int codeSizeInPixels = 250) { BarcodeWriter writer = new BarcodeWriter(); writer.Renderer = new ZXing.Rendering.BitmapRenderer { Background = Color.Red, Foreground = Color.Blue }; writer.Format = BarcodeFormat.QR_CODE; writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//編碼問題 writer.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H); writer.Options.Height = writer.Options.Width = codeSizeInPixels; writer.Options.Margin = 0;//設置邊框1 ZXing.Common.BitMatrix bm = writer.Encode(msg); Bitmap img = writer.Write(msg); return img; } #endregion }
好了,上邊的代碼復制粘貼,即可用,
如果你問我原理,那么我只能對你說:請去米國,問問原著的作者吧!有些東東真的沒必要鑽牛角尖,否則,老師都會嫌棄你!
嘻嘻,牛逼吹完了,如果你感覺好,就點個贊吧!謝謝。
@陳卧龍的博客