C# 實現二維碼和條形碼生成:從入門到實戰
文章目錄
- C# 實現二維碼和條形碼生成:從入門到實戰
- 一、引言
- 二、準備工作
- 2.1 開發環境搭建
- 2.2 引入相關庫
- 三、生成條形碼
- 3.1 條形碼基本概念
- 3.2 使用[ZXing.Net](https://ZXing.Net)生成條形碼
- 3.2.1 核心代碼實現
- 3.2.2 代碼調用與測試
- 四、生成二維碼
- 4.1 二維碼基本概念
- 4.2 使用[ZXing.Net](https://ZXing.Net)生成二維碼
- 4.2.1 核心代碼實現
- 4.2.2 代碼調用與測試
- 五、生成帶 Logo 的二維碼
- 5.1 實現思路
- 5.2 代碼實現
一、引言
最近項目開發中遇到了使用字符串生成二維碼和條形碼的需求,所以對這些知識做一個總結,方便后續參考。
二、準備工作
2.1 開發環境搭建
本文使用的開發工具是 Visual Studio 2022,創建的是WPF應用程序,項目創建過程不再贅述。
2.2 引入相關庫
在 C# 中生成二維碼和條形碼,我們將使用ZXing.Net庫。這是一個開源的庫,支持生成和解析多種格式的二維碼和條形碼。下面是引入ZXing.Net庫的詳細步驟:
(1)在 Visual Studio 的 “解決方案資源管理器” 中,右鍵點擊項目名稱,選擇 “管理 NuGet 程序包”。
(2)在打開的 “NuGet 包管理器” 窗口中,切換到 “瀏覽” 選項卡。
(3)在搜索框中輸入 “ZXing.Net”,然后點擊搜索按鈕。
(4)在搜索結果中找到 “ZXing.Net” 包,點擊 “安裝” 按鈕。
(5)閱讀并接受許可協議,等待安裝完成。
(6)安裝完成后,在 “解決方案資源管理器” 的 “依賴項”->“包” 中可以看到 “ZXing.Net”,這表示庫已經成功引入項目。
三、生成條形碼
3.1 條形碼基本概念
條形碼是將寬度不等的多個黑條和空白,按照一定的編碼規則排列,用以表達一組信息的圖形標識符 。常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)排成的平行線圖案。常見的條形碼類型有 Code 39、Code 128、EAN-13 等。Code 39 碼可表示數字、字母等信息,常用于工業、圖書及票證的自動化管理;Code 128 碼能表示 ASCII 0 到 ASCII 127 共計 128 個 ASCII 字符,在物流包裹追蹤等場景中常用;EAN-13 碼是國際物品編碼協會制定的一種商品用條碼,通用于全世界,我們日常購買的商品包裝上所印的條碼很多就是 EAN-13 碼 ,由前綴部分、制造廠商代碼、商品代碼和校驗碼組成。條形碼的應用場景極為廣泛,在零售行業,收銀員通過掃描商品的條形碼,能快速獲取商品的價格、名稱等信息,完成結賬流程,同時也方便商家進行庫存管理;在物流行業,貨物上的條形碼記錄了貨物的發貨地、目的地、訂單號等信息,方便物流公司對貨物進行分揀、運輸和追蹤。
3.2 使用ZXing.Net生成條形碼
3.2.1 核心代碼實現
下面是使用ZXing.Net生成條形碼的 C# 代碼示例:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing.Common;namespace ZXing.Net.Example
{public class BarcodeGenerator{public static Bitmap GenerateBarcode(string content, BarcodeFormat format, int width, int height, int margin){//創建BarcodeWriter對象,用于生成條形碼BarcodeWriter writer = new BarcodeWriter();//設置條形碼的編碼格式,例如Code 128、Code 39等writer.Format = format;//設置條形碼的相關參數writer.Options = new EncodingOptions{//設置條形碼的寬度Width = width,//設置條形碼的高度Height = height,//設置條形碼的邊距Margin = margin};//調用Write方法生成條形碼圖片,傳入要編碼的內容return writer.Write(content);}}
}
3.2.2 代碼調用與測試
在主程序或測試方法中,可以這樣調用上述生成條形碼的方法:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成條形碼的內容string content = "1234567890";//選擇條形碼格式,這里使用Code 128BarcodeFormat format = BarcodeFormat.CODE_128;//條形碼寬度int width = 300;//條形碼高度int height = 100;//條形碼邊距int margin = 10;//調用生成條形碼的方法Bitmap barcodeBitmap = BarcodeGenerator.GenerateBarcode(content, format, width, height, margin);//使用System.Drawing.Common中的Image類來顯示圖片using (System.Drawing.Image image = barcodeBitmap){//這里可以將image保存到文件系統或者顯示在界面上,以下是簡單保存到文件的示例image.Save("barcode.png", System.Drawing.Imaging.ImageFormat.Png);}BitmapImage bitmapImage = BitmapToBitmapImage(barcodeBitmap);testBarcode.Source = bitmapImage;}private BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap){BitmapImage bitmapImage = new BitmapImage();using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){bitmap.Save(ms, ImageFormat.Png);bitmapImage.BeginInit();bitmapImage.StreamSource = ms;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();bitmapImage.Freeze();}return bitmapImage;}}
}
四、生成二維碼
4.1 二維碼基本概念
二維碼,又稱二維條碼,是一種用特定幾何圖形按黑白相間的方式在二維方向上記錄數據信息的圖形 。它的編碼原理基于計算機的 “0” 和 “1” 比特流概念,通過黑白小方塊(幾何形體)來表示文字數值信息 。比如,黑色小方塊代表 “1”,白色小方塊代表 “0” ,這些小方塊按特定規則排列,就能存儲豐富的信息。
二維碼具有諸多顯著特點。首先是信息容量大,與一維條形碼相比,它能夠在有限的空間內存儲更多的信息,像文本、圖片、網址、文件等都能被存儲。例如,火車票上的二維碼就包含了車次、座位號、乘車人身份信息等大量內容 。其次,二維碼糾錯能力強,當二維碼部分被污損、遮擋時,憑借其糾錯算法,掃描設備仍能準確識別其中的信息 。一般來說,二維碼的糾錯等級可分為 L(7% 容錯率)、M(15% 容錯率)、Q(25% 容錯率)、H(30% 容錯率)四個等級 ,以 H 等級為例,即便有 30% 的碼字損壞,也能正常解碼。另外,二維碼制作成本低,只需借助普通的圖形處理軟件和打印機,就能輕松生成和打印,而且它的識讀速度快,在移動支付、信息查詢等場景中,用戶只需瞬間就能完成掃碼操作。
常見的二維碼類型有 QR Code、PDF417、Data Matrix 等 。QR Code 是目前應用最為廣泛的二維碼,像微信、支付寶的付款碼、收款碼等都采用了 QR Code 格式,它具有超高速識讀的特性,很適合在工業自動化生產線管理等領域應用;PDF417 是一種堆疊式二維碼,可表示數字、字母、二進制數據及漢字,信息密度高,常用于證件管理、執照年檢等場景,比如一些國家的身份證、駕駛證上就使用了 PDF417 碼來存儲個人信息 ;Data Matrix 是一種矩陣式二維碼,其突出特點是密度高,最小尺寸小,特別適用于小零件的標識,像電子元器件、精密儀器等產品上常常能看到 Data Matrix 碼 。
二維碼的應用場景十分廣泛,在移動支付領域,人們通過掃描二維碼就能快速完成支付,實現無現金交易,極大地提高了交易效率和便利性;在信息查詢方面,博物館的展品介紹、圖書的相關信息等都能通過二維碼來展示,用戶掃描二維碼即可獲取詳細內容;在身份識別領域,電子身份證、電子護照等都利用二維碼來存儲個人身份信息,方便快捷且安全可靠。
4.2 使用ZXing.Net生成二維碼
4.2.1 核心代碼實現
以下是使用ZXing.Net生成二維碼的 C# 代碼示例:
using System.Drawing;
using ZXing.Common;namespace ZXing.Net.Example
{public class QrCodeGenerator{public static Bitmap GenerateQRCode(string content, int width, int height, int margin){//創建BarcodeWriter對象,用于生成二維碼BarcodeWriter writer = new BarcodeWriter();//設置二維碼的編碼格式為QR_CODEwriter.Format = BarcodeFormat.QR_CODE;//設置二維碼的相關參數writer.Options = new EncodingOptions{//設置二維碼的寬度Width = width,//設置二維碼的高度Height = height,//設置二維碼的邊距Margin = margin};//調用Write方法生成二維碼圖片,傳入要編碼的內容return writer.Write(content);}}
}
4.2.2 代碼調用與測試
在主程序或測試方法中,可以按照以下方式調用上述生成二維碼的方法:
using System.Drawing;
using System.Windows;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成二維碼的內容string content = "https://www.csdn.net/";//二維碼寬度int width = 200;//二維碼高度int height = 200;//二維碼邊距int margin = 5;//調用生成二維碼的方法Bitmap qrCodeBitmap = QrCodeGenerator.GenerateQRCode(content, width, height, margin);//使用System.Drawing.Common中的Image類來顯示圖片using (System.Drawing.Image image = qrCodeBitmap){//這里可以將image保存到文件系統或者顯示在界面上,以下是簡單保存到文件的示例image.Save("qrcode.png", System.Drawing.Imaging.ImageFormat.Png);}}}
}
五、生成帶 Logo 的二維碼
5.1 實現思路
生成帶 Logo 的二維碼,我們可以分兩步進行。首先,利用前面介紹的方法,借助ZXing.Net庫先生成一個普通的二維碼圖片。然后,加載事先準備好的 Logo 圖片,根據二維碼圖片的大小,合理調整 Logo 圖片的尺寸,使其能夠完美地融入二維碼中。最后,使用System.Drawing
命名空間下的Graphics
類,將調整好大小的 Logo 圖片繪制到二維碼圖片的中心位置,從而得到帶 Logo 的二維碼圖片。
5.2 代碼實現
以下是生成帶 Logo 二維碼的完整 C# 代碼:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing.Common;namespace ZXing.Net.Example
{public class QrCodeWithLogoGenerator{public static Bitmap GenerateQRCodeWithLogo(string content, int width,int height, int margin, string logoPath){//先生成普通二維碼BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;writer.Options = new EncodingOptions{Width = width,Height = height,Margin = margin};//加載Logo圖片Bitmap logoBitmap = new Bitmap(logoPath);//計算Logo圖片在二維碼中的大小和位置int logoWidth = Math.Min((int)(width * 0.2), logoBitmap.Width);int logoHeight = Math.Min((int)(height * 0.2), logoBitmap.Height);int logoX = (width - logoWidth) / 2;int logoY = (height - logoHeight) / 2;//將Logo圖片繪制到二維碼圖片上Bitmap qrCodeBitmap = writer.Write(content);using (Graphics g = Graphics.FromImage(qrCodeBitmap)){g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;g.DrawImage(logoBitmap, new Rectangle(logoX, logoY, logoWidth, logoHeight));}return qrCodeBitmap;}}
}
在主程序或測試方法中調用該方法的示例代碼如下:
using System.Drawing;
using System.Windows;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成二維碼的內容string content = "https://www.csdn.net/";//二維碼寬度int width = 300;//二維碼高度int height = 300;//二維碼邊距int margin = 10;//Logo圖片路徑string logoPath = "logo.png";//調用生成帶Logo二維碼的方法Bitmap qrCodeWithLogoBitmap = QrCodeWithLogoGenerator.GenerateQRCodeWithLogo(content, width, height, margin, logoPath);//使用System.Drawing.Common中的Image類來顯示圖片using (System.Drawing.Image image = qrCodeWithLogoBitmap){//這里可以將image保存到文件系統或者顯示在界面上,以下是簡單保存到文件的示例image.Save("qrcode_with_logo.png", System.Drawing.Imaging.ImageFormat.Png);}}}
}