zoukankan      html  css  js  c++  java
  • .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的编译
  • 相关阅读:
    metal的gpu query
    体积雾 global fog unity 及改进
    hdr rt format对颜色的影响
    unity deferred lighting
    unity linear space时 photoshop blend的正确设置
    unity linear work flow
    一些数据 bandwidth之类
    deferred rendering with msaa
    unity 显示mipmaplevel
    【转】在C#中使用SendMessage
  • 原文地址:https://www.cnblogs.com/Interkey/p/qrcode.html
Copyright © 2011-2022 走看看