C# 利用ZXing.Net來生成條形碼和二維碼

来源:https://www.cnblogs.com/hsiang/archive/2018/02/18/8452984.html
-Advertisement-
Play Games

本文是利用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

關於生成條形碼和二維碼的方式有很多,條碼的種類也有很多種,每一種都有其對應的應用領域。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 拖了這麼久,最終還是戰勝了懶惰,打開電腦寫了這篇博客,內容也很簡單,python實現字元串轉整型的int方法 python已經實現了int方法,我們為什麼還要再寫一遍,直接用不就好了?事實確實如此,但是int函數看似簡單,實際上自己來實現還是有一些坑的 1.判斷正負 這點很容易忘記 2.python ...
  • HQL查詢:hibernate獨有的查詢語言 適用於不複雜的多表查詢 示例: 實體類: package domain; public class Customer { private Long cust_id; private String cust_name; private String cus ...
  • 一、flask a、Flask是一個基於Python開發並且依賴jinja2模板和Werkzeug WSGI服務的一個微型框架,對於Werkzeug本質是Socket服務端,其用於接收http請求並對請求進行預處理,然後觸發Flask框架,開發人員基於Flask框架提供的功能對請求進行相應的處理,並 ...
  • 題目鏈接:http://poj.org/problem?id=2505 題目大意: 兩個人輪流玩游戲,Stan先手,數字 p從1開始,Stan乘以一個2-9的數,然後Ollie再乘以一個2-9的數,直到誰先將p乘到p>=n時那個人就贏了,而且輪到某人時,某人必須乘以2-9的一個數。 解題思路: 這是 ...
  • 原理 選定填充圖片的ASCII字元,不同的字元對應於不同的灰度 讀取圖片並計算各像素灰度值(同時考慮透明背景),用相應的的ASCII字元替換該像素 程式功能 支持3種文件選擇方式:選定文件(支持圖片預覽),添加文件夾,拖入文件 支持5種圖片格式:.jpg, .jpeg, .gif, .png,.bm ...
  • 之前在使用Altera的三速乙太網MAC IP的基礎上,完成了UDP協議數據傳輸。此次為了將設計移植到xilinx FPGA上,需要用到xilinx的三速乙太網MAC IP核,當然也可以自己用HDL編寫,但必須對數據鏈路層協議有非常清晰的認識。以下是在使用xilinx 三速乙太網MAC過程中的一些記 ...
  • 線程(下) 7.同步鎖 這個例子很經典,實話說,這個例子我是直接照搬前輩的,並不是原創,不過真的也很有意思,請看: 這段代碼的意思是,用一百個線程去減1,以此讓變數number為100的變為0 結果: 那麼我稍微的改下代碼看看: 並沒有很大的改變對吧,只是加了一個臨時變數,並且中途停頓了0.2s而已 ...
  • 在控制器方法的頭部添加 [ValidateInput(false)] 如果向mvc服務端提交帶html標簽的內容就會導致校驗失敗異常,從而得不到想要的結果,關閉的方法是在相應方法頭部添加 [ValidateInput(false)]屬性。 如: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...