很久之前就有寫這樣的代碼了,只是一直沒記錄下來,偶然想寫成博客。
把之前的代碼封裝成函數,以方便理解以及調用。
基於開源的 ZXing.NET 組件,代碼如下:
先添加對ZXing.NET的引用,然后添加相應的命名空間:
using System; using System.Collections.Generic; using System.Drawing; using ZXing; using ZXing.Common; using ZXing.QrCode; using ZXing.QrCode.Internal;
方法一是生成二維碼圖片:
/// <summary> /// 生成二維碼圖片 /// </summary> /// <param name="contents">要生成二維碼包含的信息</param> /// <param name="width">生成的二維碼寬度(默認300像素)</param> /// <param name="height">生成的二維碼高度(默認300像素)</param> /// <returns>二維碼圖片</returns> public static Bitmap GeneratorQrImage(string contents, int width = 300, int height = 300) { if (string.IsNullOrEmpty(contents)) { return null; } //本文地址:http://www.cnblogs.com/Interkey/p/qrcode.html EncodingOptions options = null; BarcodeWriter writer = null; options = new QrCodeEncodingOptions { DisableECI = true, CharacterSet = "UTF-8", Width = width, Height = height, ErrorCorrection = ErrorCorrectionLevel.H, }; writer = new BarcodeWriter(); writer.Format = BarcodeFormat.QR_CODE; writer.Options = options; Bitmap bitmap = writer.Write(contents); return bitmap; }
方法二是生成中間帶圖片的二維碼圖片:
/// <summary> /// 生成中間帶有圖片的二維碼圖片 /// </summary> /// <param name="contents">要生成二維碼包含的信息</param> /// <param name="middleImg">要生成到二維碼中間的圖片</param> /// <param name="width">生成的二維碼寬度(默認300像素)</param> /// <param name="height">生成的二維碼高度(默認300像素)</param> /// <returns>中間帶有圖片的二維碼</returns> public static Bitmap GeneratorQrImage(string contents, Image middleImg, int width = 300, int height = 300) { if (string.IsNullOrEmpty(contents)) { return null; } if (middleImg == null) { //return null; return GeneratorQrImage(contents); } ////本文地址:http://www.cnblogs.com/Interkey/p/qrcode.html //構造二維碼寫碼器 MultiFormatWriter mutiWriter = 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 = mutiWriter.encode(contents, BarcodeFormat.QR_CODE, width, height, hint); BarcodeWriter barcodeWriter = new BarcodeWriter(); Bitmap bitmap = barcodeWriter.Write(bm); //獲取二維碼實際尺寸(去掉二維碼兩邊空白后的實際尺寸) int[] rectangle = bm.getEnclosingRectangle(); //計算插入圖片的大小和位置 int middleImgW = Math.Min((int)(rectangle[2] / 3.5), middleImg.Width); int middleImgH = Math.Min((int)(rectangle[3] / 3.5), middleImg.Height); int middleImgL = (bitmap.Width - middleImgW) / 2; int middleImgT = (bitmap.Height - middleImgH) / 2; //將img轉換成bmp格式,否則后面無法創建 Graphics對象 Bitmap bmpimg = new Bitmap(bitmap.Width, bitmap.Height, System.Drawing.Imaging.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(bitmap, 0, 0); } //在二維碼中插入圖片 Graphics myGraphic = Graphics.FromImage(bmpimg); //白底 myGraphic.FillRectangle(Brushes.White, middleImgL, middleImgT, middleImgW, middleImgH); myGraphic.DrawImage(middleImg, middleImgL, middleImgT, middleImgW, middleImgH); return bmpimg; }
效果如下:
中間有圖片與沒有圖片的生成的不一樣,原因不清楚,初步以為中間有圖片的是因為容錯率的原故。
對應的解析代碼也很簡單:
// create a barcode reader instance IBarcodeReader reader = new BarcodeReader(); // load a bitmap Bitmap barcodeBitmap = (Bitmap)Image.FromFile("C:\\sample-barcode-image.png"); // detect and decode the barcode inside the bitmap Result result = reader.Decode(barcodeBitmap); // do something with the result if (result != null) { this.txtDecoderType.Text = result.BarcodeFormat.ToString(); this.txtDecoderContent.Text = result.Text; }
以上是生成和解析二維碼的代碼,至於生成一維碼和對應的解析也很簡單。
其他常用可生成二維碼的組件有:QrCode.Net(開源)、ZXing(開源)、ThoughtWorks.QRCode等。
了解了二維碼的數據存儲后,可以基於這些技術生成富有創意的二維碼。
參考: