本文是利用ZXing.Net在WinForm中生成條形碼,二維碼的小例子,僅供學習分享使用。 ...
本文是利用ZXing.Net在WinForm中生成條形碼,二維碼的小例子,僅供學習分享使用,如有不足之處,還請指正。
什麼是ZXing.Net?
ZXing是一個開放源碼的,用Java實現的多種格式的1D/2D條碼圖像處理庫,它包含了聯繫到其他語言的埠。而ZXing.Net是ZXing的埠之一。
在工程中引用ZXing.Net
在項目中,點擊項目名稱右鍵-->管理NuGet程式包,打開NuGet包管理器視窗,進行搜索下載即可,如下圖所示:
ZXing.Net關鍵類結構圖
包括Reader【識別圖片中的條形碼和二維碼】) 和Writer【生成條形碼和二維碼到圖片中】兩部分,如下圖所示:
涉及知識點:
- BarcodeWriter 用於生成圖片格式的條碼類,通過Write函數進行輸出。繼承關係如上圖所示。
- BarcodeFormat 枚舉類型,條碼格式
- QrCodeEncodingOptions 二維碼設置選項,繼承於EncodingOptions,主要設置寬,高,編碼方式等信息。
- MultiFormatWriter 複合格式條碼寫碼器,通過encode方法得到BitMatrix。
- BitMatrix 表示按位表示的二維矩陣數組,元素的值用true和false表示二進位中的1和0。
示例效果圖
關鍵代碼
如下所示,包含一維條碼,二維條碼,和帶logo的條碼
1 using System; 2 using System.Collections.Generic; 3 using System.Drawing; 4 using System.Drawing.Imaging; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 using ZXing; 9 using ZXing.Common; 10 using ZXing.QrCode; 11 using ZXing.QrCode.Internal; 12 13 namespace DemoQrCode 14 { 15 /// <summary> 16 /// 描述:條形碼和二維碼幫助類 17 /// 時間:2018-02-18 18 /// </summary> 19 public class BarcodeHelper 20 { 21 /// <summary> 22 /// 生成二維碼 23 /// </summary> 24 /// <param name="text">內容</param> 25 /// <param name="width">寬度</param> 26 /// <param name="height">高度</param> 27 /// <returns></returns> 28 public static Bitmap Generate1(string text,int width,int height) 29 { 30 BarcodeWriter writer = new BarcodeWriter(); 31 writer.Format = BarcodeFormat.QR_CODE; 32 QrCodeEncodingOptions options = new QrCodeEncodingOptions() 33 { 34 DisableECI = true,//設置內容編碼 35 CharacterSet = "UTF-8", //設置二維碼的寬度和高度 36 Width = width, 37 Height = height, 38 Margin = 1//設置二維碼的邊距,單位不是固定像素 39 }; 40 41 writer.Options = options; 42 Bitmap map = writer.Write(text); 43 return map; 44 } 45 46 /// <summary> 47 /// 生成一維條形碼 48 /// </summary> 49 /// <param name="text">內容</param> 50 /// <param name="width">寬度</param> 51 /// <param name="height">高度</param> 52 /// <returns></returns> 53 public static Bitmap Generate2(string text,int width,int height) 54 { 55 BarcodeWriter writer = new BarcodeWriter(); 56 //使用ITF 格式,不能被現在常用的支付寶、微信掃出來 57 //如果想生成可識別的可以使用 CODE_128 格式 58 //writer.Format = BarcodeFormat.ITF; 59 writer.Format = BarcodeFormat.CODE_39; 60 EncodingOptions options = new EncodingOptions() 61 { 62 Width = width, 63 Height = height, 64 Margin = 2 65 }; 66 writer.Options = options; 67 Bitmap map = writer.Write(text); 68 return map; 69 } 70 71 /// <summary> 72 /// 生成帶Logo的二維碼 73 /// </summary> 74 /// <param name="text">內容</param> 75 /// <param name="width">寬度</param> 76 /// <param name="height">高度</param> 77 public static Bitmap Generate3(string text, int width, int height) 78 { 79 //Logo 圖片 80 string logoPath = System.AppDomain.CurrentDomain.BaseDirectory + @"\img\logo.png"; 81 Bitmap logo = new Bitmap(logoPath); 82 //構造二維碼寫碼器 83 MultiFormatWriter writer = new MultiFormatWriter(); 84 Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>(); 85 hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8"); 86 hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 87 //hint.Add(EncodeHintType.MARGIN, 2);//舊版本不起作用,需要手動去除白邊 88 89 //生成二維碼 90 BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, width+30, height+30, hint); 91 bm = deleteWhite(bm); 92 BarcodeWriter barcodeWriter = new BarcodeWriter(); 93 Bitmap map = barcodeWriter.Write(bm); 94 95 //獲取二維碼實際尺寸(去掉二維碼兩邊空白後的實際尺寸) 96 int[] rectangle = bm.getEnclosingRectangle(); 97 98 //計算插入圖片的大小和位置 99 int middleW = Math.Min((int)(rectangle[2] / 3), logo.Width); 100 int middleH = Math.Min((int)(rectangle[3] / 3), logo.Height); 101 int middleL = (map.Width - middleW) / 2; 102 int middleT = (map.Height - middleH) / 2; 103 104 Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb); 105 using (Graphics g = Graphics.FromImage(bmpimg)) 106 { 107 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 108 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 109 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 110 g.DrawImage(map, 0, 0,width,height); 111 //白底將二維碼插入圖片 112 g.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH); 113 g.DrawImage(logo, middleL, middleT, middleW, middleH); 114 } 115 return bmpimg; 116 } 117 118 /// <summary> 119 /// 刪除預設對應的空白 120 /// </summary> 121 /// <param name="matrix"></param> 122 /// <returns></returns> 123 private static BitMatrix deleteWhite(BitMatrix matrix) 124 { 125 int[] rec = matrix.getEnclosingRectangle(); 126 int resWidth = rec[2] + 1; 127 int resHeight = rec[3] + 1; 128 129 BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); 130 resMatrix.clear(); 131 for (int i = 0; i < resWidth; i++) 132 { 133 for (int j = 0; j < resHeight; j++) 134 { 135 if (matrix[i + rec[0], j + rec[1]]) 136 resMatrix[i, j]=true; 137 } 138 } 139 return resMatrix; 140 } 141 } 142 }View Code
關於生成條形碼和二維碼的方式有很多,條碼的種類也有很多種,每一種都有其對應的應用領域。