C#生成二維碼和條形碼

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);}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904732.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904732.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904732.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++結構體介紹

結構體的定義 在C中&#xff0c;結構體&#xff08;struct&#xff09;是一種用戶定義的數據類型&#xff0c;允許將不同類型的數據組合在一起。結構體的定義使用struct關鍵字&#xff0c;后跟結構體名稱和一對花括號{}&#xff0c;花括號內包含成員變量的聲明。 struct Pers…

各類音頻放大器電路原理簡析

A類&#xff08;甲類&#xff09;放大器 晶體管在整個信號周期內始終導通&#xff0c;導通角為360 本質上是一個簡單的共源放大電路&#xff0c;M1 是放大管&#xff0c;M2 為電流源管負載&#xff0c;其最大輸出電流受ID2控制&#xff0c;帶負載能力弱。 B類&#xff08;乙類…

OpenCV的 ccalib 模塊用于自定義標定板的檢測和處理類cv::ccalib::CustomPattern()----函數calibrate

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::ccalib::CustomPattern 是OpenCV的 ccalib 模塊中的一個類&#xff0c;主要用于自定義標定板的檢測和處理。這個模塊提供了比傳統的 calib3d…

【從零開始學習RabbitMQ | 第一篇】從異步通信到交換機

目錄 前言 1.什么是RabbitMQ&#xff1f; 2.同步調用的優缺點 3.異步調用的優缺點 3.1優點&#xff1a; 3.2異步調用的問題是什么&#xff1f; 4技術選型 4.1AMQP協議就是&#xff1a; 4.2kafka和RabbitMQ的使用場景 5.安裝RabitMq 6.rabitmq的整體架構 7.RabibtM…

Dify MCP實戰 - 郵件發送

安裝MCP sse插件 配置MCP Server 由于Dify 目前還沒有支持stdio方式連接MCP Server。我們找到了Zapier&#xff0c;輕松調用 7000 App 工具。 Zapier配置 ? 訪問 https://actions.zapier.com/settings/mcp/ ? 添加Gmail Send Email工具 ? 授權自己的Gmail郵箱 ? 復制Za…

uniapp 微信小程序使用圖表

使用的是秋云 ucharts 直接在hbuilder插件市場進行下載導入項目中&#xff0c;多端支持 下載地址秋云 ucharts echarts 高性能跨全端圖表組件 - DCloud 插件市場 導入成功后這里就能看到導入的插件啦 導入項目后就可以直接在頁面中通過組件使用了 不需要其余配置 使用簡單 參…

Python數據脫敏技術在大模型機器學習中的深度應用與實踐

一、數據脫敏技術體系詳解 1.1 結構化數據脫敏技術 1.1.1 列級脫敏策略 import pandas as pd from faker import Fakerclass StructuredDataMasker:def __init__(self):self.faker =

【設計模式】GoF設計模式之策略模式(Strategy Pattern)

設計模式之策略模式 Strategy Pattern V1.0核心概念角色代碼示例程序運行結果代碼講解 適用范圍 V1.0 核心概念 策略模式是一種行為型設計模式&#xff0c;其核心思想是業務類執行某個動作時&#xff0c;可以使用該動作的不同的實現&#xff0c;并在程序運行中可以切換使用該…

VS Code配置指南:打造高效的QMK開發環境

VS Code配置指南&#xff1a;打造高效的QMK開發環境 前言 你是否曾為QMK固件開發環境的搭建而頭疼不已&#xff1f;本文將手把手教你使用Visual Studio Code&#xff08;簡稱VS Code&#xff09;這款強大的代碼編輯器來構建一個完美的QMK開發環境&#xff0c;讓你的鍵盤固件開…

java CompletableFuture 異步編程工具用法1

1、測試異步調用&#xff1a; static void testCompletableFuture1() throws ExecutionException, InterruptedException {// 1、無返回值的異步任務。異步線程執行RunnableCompletableFuture.runAsync(() -> System.out.println("only you"));// 2、有返回值的異…

中國自動駕駛研發解決方案,第一!

4月28日&#xff0c;IDC《中國汽車云市場(2024下半年)跟蹤》報告發布&#xff0c;2024下半年中國汽車云市場整體規模達到65.1億元人民幣&#xff0c;同比增長27.4%。IDC認為&#xff0c;自動駕駛技術深化與生成式AI的發展將為汽車云打開新的成長天花板&#xff0c;推動云計算在…

如何快速獲取字符串的UTF-8或UTF-16編碼二進制數據?數值轉換成字符串itoa不是C標準?其它類型轉換成字符串?其它類型轉換成數值類型?

目錄 如何快速獲取字符串的UTF-8或UTF-16編碼二進制數據? 數值轉換成字符串itoa不是C標準&#xff1f; 其它類型轉換成字符串 其它類型轉換成數值類型 轉換成數值的API 為什么有的編程語言允許字符串和整數相加? 字符串拼接 字符串字面量自動連接 如何快速獲取字符串…

Android SDK 國內鏡像及配置方法(2025最新,包好使!)

2025最新android sdk下載配置 1、首先你需要有android sdk manager2、 直接上教程修改hosts文件配置域名映射即可(不用FQ)2.1 獲取ping dl.google.com域名ip地址2.2 配置hosts文件域名映射2.3 可以隨意下載你需要的sdk3、 總結:走過彎路,踩過坑!!!大家就不要踩了!避坑1…

MySQL事務隔離機制與并發控制策略

MySQL事務隔離機制與并發控制策略 MySQL事務隔離機制與并發控制策略一、數據庫并發問題全景解析二、事務隔離級別深度解析三、MySQL并發控制核心技術1. 多版本并發控制&#xff08;MVCC&#xff09;2. 鎖機制 四、隔離級別實現差異對比五、生產環境最佳實踐六、高級優化技巧七、…

Python `zip()` 函數是什么

Python zip() 函數是什么 在 Python 里,zip() 是一個內置函數,其主要作用是將多個可迭代對象(像列表、元組、字符串等)中的元素一一對應地組合成元組,最終返回一個迭代器,這個迭代器會生成這些元組。 基本語法 zip(*iterables)其中,*iterables 代表可變數量的可迭代對…

Jenkins 改完端口號啟動不起來了

讓我們將 Jenkins 恢復到默認的 8080 端口&#xff0c;確保它能正常啟動&#xff1a; 1. 修改 Jenkins 的配置文件&#xff1a; sudo nano /etc/default/jenkins 將內容修改為&#xff1a; HTTP_PORT8080 JENKINS_ARGS"--webroot/var/cache/jenkins/war --httpPort8080…

【AWS+Wordpress-準備階段】AWS注冊+創建EC2實例

前言 自學筆記&#xff0c;解決問題為主&#xff0c;親測有效&#xff0c;歡迎補充。 本地WP文件部署到AWS整體步驟如下&#xff1a;&#xff08;本文重點&#xff1a;AWS準備完成&#xff09; 0. [AWS 準備] 注冊 AWS 并創建 EC2 實例 ↓ 1. [生成安裝包&#xff1a;用 Du…

使用pytorch保存和加載預訓練的模型方法

需要使用到的函數 在 PyTorch 中&#xff0c;torch.save() 和 torch.load() 是用于保存和加載模型的核心函數。 torch.save() 函數 主要用途&#xff1a;將模型或模型的狀態字典&#xff08;state_dict&#xff09;保存到文件中。 語法&#xff1a; torch.save(obj, f, pi…

Python從入門到高手8.3節-元組的常用操作方法

目錄 11.3.1 元組的常用操作方法 11.3.2 元組的查找 11.3.3 祈禱明天不再打雷下雨 11.3.1 元組的常用操作方法 元組類型是一種抽象數據類型&#xff0c;抽象數據類型定義了數據類型的操作方法&#xff0c;在本節的內容中&#xff0c;著重介紹元組類型的操作方法。 ? 元組是…

圖書推薦(協同過濾)算法的實現:基于訂單購買實現相似用戶的圖書推薦

代碼部分 package com.ruoyi.system.service.impl;import com.ruoyi.system.domain.Book; import com.ruoyi.system.domain.MyOrder; import com.ruoyi.system.mapper.BookMapper; import com.ruoyi.system.mapper.MyOrderMapper; import com.ruoyi.system.service.IBookRecom…