基於Asp.Net Core,利用ZXing來生成二維碼的一般流程

来源:https://www.cnblogs.com/VueDi/archive/2020/04/07/11312371.html
-Advertisement-
Play Games

在.net環境下,基於Asp.Net Core,利用ZXing來生成二維碼的一般操作。 ...


  本文主要介紹如何在.net環境下,基於Asp.Net Core,利用ZXing來生成二維碼的一般操作。對二維碼工作原理瞭解,詳情見:https://blog.csdn.net/weixin_36191602/article/details/82466148文章介紹。

1、前期準備

  .net core preview8,vs2019(用於支持core3.0),二維碼生成插件:開源庫ZXIng。相關插件可以在github上找到。安裝vs2019後新建.net core web解決方案,也可以右鍵該解決方案,通過管理解決方案Nuget包功能來找到。如下圖:瀏覽中搜索Zxing第一個既是。選中安裝即可。

 

 

   可通過項目中依賴性查看相應包的引用。如圖: 

 2.二維碼生成

2.1前端頁面

 在login.cshtml頁面中添加前端元素,主要是一個圖片控制項。

1 <div style="text-align:center">
2     <div style="margin-top:20px">
3         <span>掃碼獲取</span><br/>
4         <img id="barcode" width="400" height="400" alt="掃碼獲取" src="Dynpass/GetBarCode"/>
5     </div>
6 </div>
src="Dynpass/GetBarCode"表示image數據從DynpassController的GetBarCode方法獲取。

 2.1後端代碼

 初始化界面以及二維碼資源生成方法:

 1  public class DynPassController : Controller
 2     {
 3         private readonly BarCodeVue  _barCodeContent;//
 4         public DynPassController(IOptions<BarCodeVue> content)
 5         {
 6             this._barCodeContent = content.Value;
 7         }
 8 
 9         /// <summary>
10         /// 初始化顯示頁面
11         /// </summary>
12         /// <returns></returns>
13         [HttpGet]
14         public IActionResult Login()
15         {
16             return View();
17         }
18 
19         /// <summary>
20         /// Svn顯示==請求獲取二維碼資源
21         /// </summary>
22         /// <returns></returns>
23         [HttpGet]
24         public ActionResult GetBarCode()
25         {
26             var bar= _barCodeContent != null ? _barCodeContent.BarCode : "掃碼獲取";
27             Bitmap bitmap = MyZxingBarcode.GenerateBitmapCode(bar);//掃碼獲取
28             System.IO.MemoryStream ms = new System.IO.MemoryStream();
29             bitmap.Save(ms, ImageFormat.Bmp);
30             return File(ms.GetBuffer(), "image/png");//
31         }
32     }
DynPassController生成二維碼的內容即_barCodeContent值由core框架依賴註入(構造該對象時通過構造函數傳入)。所以需在ConfigureServices中進行註冊。
Barcode類結構

1  public class BarCodeVue
2     {
3         public string BarCode { get; set; }
4     }

二維碼內容註冊

具體步驟:

1.在appsettings.json中添加節點。

 1 {
 2   "Logging": {
 3     "LogLevel": {
 4       "Default": "Information",
 5       "Microsoft": "Warning",
 6       "Microsoft.Hosting.Lifetime": "Information"
 7     }
 8   },
 9   "BarCodeVue": {
10     "BarCode":"MyBarCode"
11   },
12 
13   "AllowedHosts": "*"
14 }

2.BarCodeVue註冊

在Program類中ConfigureServices方法中通過Configure註冊。

 1  // This method gets called by the runtime. Use this method to add services to the container.
 2         public void ConfigureServices(IServiceCollection services)
 3         {
 4             services.Configure<CookiePolicyOptions>(options =>
 5             {
 6                 // This lambda determines whether user consent for non-essential cookies is needed for a given request.
 7                 options.CheckConsentNeeded = context => true;
 8             });
 9             services.Configure<BarCodeVue>(Configuration.GetSection("BarCodeVue"));//註冊BarCodeVue鍵值
10             //services.AddMvc().AddViewOptions(options => options.HtmlHelperOptions.ClientValidationEnabled = true);
11             services.AddControllersWithViews()
12                 .AddNewtonsoftJson();
13             services.AddRazorPages();
14         }

3.生成二維碼方法MyZxingBarcode類

  public class MyZxingBarcode
    {
        /// <summary>
        /// 生成二維碼,保存成圖片
        /// </summary>
        public static Bitmap GenerateBitmapCode(string content)
        {
            var writer = new BarcodeWriterPixelData();
            writer.Format = BarcodeFormat.QR_CODE;
            QrCodeEncodingOptions options = new QrCodeEncodingOptions();
            options.DisableECI = true;
            //設置內容編碼
            options.CharacterSet = "UTF-8";
            //設置二維碼的寬度和高度
            options.Width = 300;
            options.Height = 300;
            //設置二維碼的邊距,單位不是固定像素
            options.Margin = 1;
            writer.Options = options;
            //
            var pixdata = writer.Write(content);
            var map = PixToBitmap(pixdata.Pixels, pixdata.Width, pixdata.Height);
            //string filename = @"D:\generate1.png";
            //map.Save(filename, ImageFormat.Bmp);
            return map;
        }

        /// <summary>  
        /// 將一個位元組數組轉換為點陣圖  
        /// </summary>  
        /// <param name="pixValue">顯示位元組數組</param>  
        /// <param name="width">圖像寬度</param>  
        /// <param name="height">圖像高度</param>  
        /// <returns>點陣圖</returns>  
        private static Bitmap PixToBitmap(byte[] pixValue, int width, int height)
        {
            //// 申請目標點陣圖的變數,並將其記憶體區域鎖定
            var m_currBitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
            var m_rect = new Rectangle(0, 0, width, height);
            var m_bitmapData = m_currBitmap.LockBits(m_rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);

            IntPtr iptr = m_bitmapData.Scan0;  // 獲取bmpData的記憶體起始位置  

            //// 用Marshal的Copy方法,將剛纔得到的記憶體位元組數組複製到BitmapData中  
            System.Runtime.InteropServices.Marshal.Copy(pixValue, 0, iptr, pixValue.Length);
            m_currBitmap.UnlockBits(m_bitmapData);
            //// 演算法到此結束,返回結果  

            return m_currBitmap;


            ////初始化條形碼格式,寬高,以及PureBarcode=true則不會留白框
            //var writer = new BarcodeWriterPixelData
            //{
            //    Format = BarcodeFormat.QR_CODE,
            //    Options = new ZXing.Common.EncodingOptions { Height = 31, Width = 167, PureBarcode = true, Margin = 1 }
            //};
            //var pixelData = writer.Write("123236699555555555559989966");
            //using (var bitmap = new Bitmap(pixelData.Width, pixelData.Height, PixelFormat.Format32bppRgb))
            //using (var ms = new MemoryStream())
            //{
            //    var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height),
            //       System.Drawing.Imaging.ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);
            //    try
            //    {
            //        // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image
            //        System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
            //    }
            //    finally
            //    {
            //        bitmap.UnlockBits(bitmapData);
            //    }
            //    // save to stream as PNG
            //    bitmap.Save(ms, ImageFormat.Png);
            //    Image image = Bitmap.FromStream(ms, true);
            //    image.Save(@"D:\content.png");
            //    byte[] bytes = ms.GetBuffer();
            //}
        }
    }

 

運行生成結果:

 

 

 

 遺留問題:

當barcode包含中文時,生成二維碼掃碼得出結果是亂碼。網上找了一些解決方案均不行。有時間在研究吧。在此記錄作個記錄。

 


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

-Advertisement-
Play Games
更多相關文章
  • 歷史原因,筆者所在公司的項目目前還在使用 .NET CORE 2.2版本,在所有業務應用升級完成服務註冊發現之後,最後剩下 Ocelot 網關服務升級。在升級過程中,遇到一些問題,記錄此文,以便有相同情況的同學參考。 1. Ocelot 升級服務發現 "根據官方文檔" ,通過簡單的添加配置,既可以將 ...
  • 項目中可能會遇到重寫控制項的情況,特此記錄下: 1 <Window x:Class="WpfApp6.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://sc ...
  • 創建一個簡單用戶控制項是開始自定義控制項的好方法。本章主要介紹創建一個基本的顏色拾取器。接下來分析如何將這個控制項分解成功能更強大的基於模板的控制項。 創建基本的顏色拾取器很容易。然而,創建自定義顏色拾取器仍是有價值的聯繫,因為這不僅演示了構建控制項的各種重要概念,而且提供了一個實用的功能。 可為顏色拾取器創 ...
  • 需求很簡單,就是文本框想要個placeholder的效果,中文的時候顯示“姓名”,英文的時候顯示“Name”,於是有了以下代碼: 然後,動態切換成英文資源的時候,發現他還是中文的,暈。後來改成以下代碼就OK了,不知和解? ...
  • public static int AddBook(BookInfo bookInfo) { using (BookDBContext dbContext = new BookDBContext()) { dbContext.BookInfo.Add(bookInfo); return (dbCon ...
  • /// <summary> /// 修改 /// </summary> /// <param name="bookInfo"></param> /// <returns></returns> public static bool Update(BookInfo bookInfo) { using ( ...
  • 必應每天都會更換背景圖片,都非常漂亮,有的時候還十分驚艷,同時還會根據每個地區的特色不同應用不同的圖片。 下麵用c 抓取必應每天的背景圖片,並實現桌面壁紙的每天自動切換 實現思路 1.通過獲取“必應”網頁背景圖片URL 2.下載圖片到本地 3.設置這個圖片為壁紙 4.每日自動切換壁紙 1.創建項目文 ...
  • 1. 升級到Core的好處 去年中我曾考慮將我的控制項庫項目 "Kino.Toolkit.Wpf" 升級到.NET Core,不過很快放棄了,因為當時.NET Core是預覽版,編譯WPF還需要使用最新的Visual Studio 2019,這樣作為一個教學項目不夠友好。到了今天.NET Core 3 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...