.NET使用ZXing.NET生成中間帶圖片的二維碼


很久之前就有寫這樣的代碼了,只是一直沒記錄下來,偶然想寫成博客。

把之前的代碼封裝成函數,以方便理解以及調用。

基於開源的 ZXing.NET 組件,代碼如下:

先添加對ZXing.NET的引用,然后添加相應的命名空間:

using System;
using System.Collections.Generic;
using System.Drawing;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
using ZXing.QrCode.Internal;

 方法一是生成二維碼圖片:

/// <summary>
/// 生成二維碼圖片
/// </summary>
/// <param name="contents">要生成二維碼包含的信息</param>
/// <param name="width">生成的二維碼寬度(默認300像素)</param>
/// <param name="height">生成的二維碼高度(默認300像素)</param>
/// <returns>二維碼圖片</returns>
public static Bitmap GeneratorQrImage(string contents, int width = 300, int height = 300)
{
    if (string.IsNullOrEmpty(contents))
    {
        return null;
    }
    //本文地址:http://www.cnblogs.com/Interkey/p/qrcode.html
    EncodingOptions options = null;
    BarcodeWriter writer = null;
    options = new QrCodeEncodingOptions
    {
        DisableECI = true,
        CharacterSet = "UTF-8",
        Width = width,
        Height = height,
        ErrorCorrection = ErrorCorrectionLevel.H,
    };
    writer = new BarcodeWriter();
    writer.Format = BarcodeFormat.QR_CODE;
    writer.Options = options;

    Bitmap bitmap = writer.Write(contents);
    return bitmap;
}

方法二是生成中間帶圖片的二維碼圖片:

/// <summary>
/// 生成中間帶有圖片的二維碼圖片
/// </summary>
/// <param name="contents">要生成二維碼包含的信息</param>
/// <param name="middleImg">要生成到二維碼中間的圖片</param>
/// <param name="width">生成的二維碼寬度(默認300像素)</param>
/// <param name="height">生成的二維碼高度(默認300像素)</param>
/// <returns>中間帶有圖片的二維碼</returns>
public static Bitmap GeneratorQrImage(string contents, Image middleImg, int width = 300, int height = 300)
{
    if (string.IsNullOrEmpty(contents))
    {
        return null;
    }
    if (middleImg == null)
    {
        //return null;
        return GeneratorQrImage(contents);
    }
    ////本文地址:http://www.cnblogs.com/Interkey/p/qrcode.html
    //構造二維碼寫碼器
    MultiFormatWriter mutiWriter = new MultiFormatWriter();
    Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
    hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
    hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

    //生成二維碼
    BitMatrix bm = mutiWriter.encode(contents, BarcodeFormat.QR_CODE, width, height, hint);
    BarcodeWriter barcodeWriter = new BarcodeWriter();
    Bitmap bitmap = barcodeWriter.Write(bm);
            
    //獲取二維碼實際尺寸(去掉二維碼兩邊空白后的實際尺寸)
    int[] rectangle = bm.getEnclosingRectangle();

    //計算插入圖片的大小和位置
    int middleImgW = Math.Min((int)(rectangle[2] / 3.5), middleImg.Width);
    int middleImgH = Math.Min((int)(rectangle[3] / 3.5), middleImg.Height);
    int middleImgL = (bitmap.Width - middleImgW) / 2;
    int middleImgT = (bitmap.Height - middleImgH) / 2;

    //將img轉換成bmp格式,否則后面無法創建 Graphics對象
    Bitmap bmpimg = new Bitmap(bitmap.Width, bitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmpimg))
    {
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.DrawImage(bitmap, 0, 0);
    }

    //在二維碼中插入圖片
    Graphics myGraphic = Graphics.FromImage(bmpimg);
    //白底
    myGraphic.FillRectangle(Brushes.White, middleImgL, middleImgT, middleImgW, middleImgH);
    myGraphic.DrawImage(middleImg, middleImgL, middleImgT, middleImgW, middleImgH);
    return bmpimg;
}

效果如下:

QRCode

中間有圖片與沒有圖片的生成的不一樣,原因不清楚,初步以為中間有圖片的是因為容錯率的原故。

對應的解析代碼也很簡單:

// create a barcode reader instance
IBarcodeReader reader = new BarcodeReader();
// load a bitmap
Bitmap barcodeBitmap = (Bitmap)Image.FromFile("C:\\sample-barcode-image.png");
// detect and decode the barcode inside the bitmap
Result result = reader.Decode(barcodeBitmap);
// do something with the result
if (result != null)
{
    this.txtDecoderType.Text = result.BarcodeFormat.ToString();
    this.txtDecoderContent.Text = result.Text;
}

以上是生成和解析二維碼的代碼,至於生成一維碼和對應的解析也很簡單。

 

其他常用可生成二維碼的組件有:QrCode.Net(開源)、ZXing(開源)、ThoughtWorks.QRCode等。

了解了二維碼的數據存儲后,可以基於這些技術生成富有創意的二維碼。


 

參考:

  1. QR二維碼生成器源碼(中間可插入小圖片)
  2. 用C#實現的條形碼和二維碼編碼解碼器
  3. 如何在ASP.NET和WPF中顯示二維碼
  4. C#利用QrCode.Net生成二維碼(Qr碼)
  5. 二維碼的生成細節和原理
  6. 帶你探索條形碼世界的奧秘
  7. Android二維碼識別 開源項目ZXing的編譯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM