C#生成条码

技术目标

实现C#生成QR二维码,Code128条形码和DM二维码,以及上述三种条码的解析。

技术过程

  1. 二维码

二维码中,我们最常使用的是QR条码,广泛的存在于我们生活中,如:支付宝,微信扫码,而工业上,使用频率较高的也包括DM码。

两种码形的出现背景,具体区别,我在这里就不在追溯了,主要是如何在C#中生成和解析。

QR码的生成,在C#中是比较简单的,如果你上网进行搜索,一般会找到QRCoderThoughtWorks.QRCode等组件,但是QRCoder是不带有解析方法的。

  1. 条形码

条形码中,码形更加多,最常用的必属于Code128,所以这里只讨论Code128的生成和解析,网络上的资源,寻找的时候,组件包括BarcodeLib这些,

  1. 统一组件

经过上面的分析,发现在不同条码生成的过程中,有很多组件选择,那么有没有一种可以统一所有码形的组件呢?

BarCode组件支持所有上面的操作,包括生成和解析。

技术模式

Barcode组件

 

using IronBarCode;
using PL.Error.Extension;
using System;
using System.Diagnostics.Contracts;
using System.Drawing;
using System.Text;
using System.Threading;

namespace PL.Util.PrideFile.PImage
{
    /// <summary>
    /// 条码工具类
    /// Date:20210715
    /// </summary>
    public class BarCodeUtil
    {
        #region 构造函数

        private BarCodeUtil()
        {
        }

        #endregion 构造函数

        #region 单例

        private static BarCodeUtil Value;

        public static BarCodeUtil Instance
        {
            get
            {
                return LazyInitializer.EnsureInitialized(ref Value, () => new BarCodeUtil());
            }
        }

        #endregion 单例

        #region 方法

        #region 生成QRCode

        public Image CreateQRCode(string code)
        {
            #region 校验

            Contract.Requires(!string.IsNullOrEmpty(code), "二维码内容不能为空");
            Contract.Requires(Encoding.Default.GetBytes(code).Length < 1500, "二维码容量不超过1500字节");

            #endregion 校验

            try
            {
                // 使用默认的生成配置
                return BarcodeWriter.CreateBarcode(code, BarcodeWriterEncoding.QRCode).Image;
            }
            catch (Exception ex) when (ex.Log()) { return null; }
            catch
            {
                throw;
            }
        }

        #endregion 生成QRCode

        #region 解析QRCode

        public string AnalysisQRCode(Bitmap image)
        {
            #region 校验

            Contract.Requires(image != null, "二维码识别图片不能为空");

            #endregion 校验

            try
            {
                return BarcodeReader.QuicklyReadOneBarcode(image, BarcodeEncoding.QRCode).Text;
            }
            catch (Exception ex) when (ex.Log()) { return null; }
            catch
            {
                throw;
            }
        }

        #endregion 解析QRCode

        #region 生成Code128

        public Image CreateCode128(string code, int maxWidth = 1000, int maxHeight = 300)
        {
            #region 校验

            Contract.Requires(!string.IsNullOrEmpty(code), "Code128内容不能为空");
            Contract.Requires(Encoding.Default.GetBytes(code).Length <= 200, "Code128不超过200字节");

            #endregion 校验

            try
            {
                BarcodeWriter.DefaultWidth = 800;
                return BarcodeWriter.CreateBarcode(code, BarcodeWriterEncoding.Code128, maxWidth, maxHeight).Image;
            }
            catch (Exception ex) when (ex.Log()) { return null; }
            catch
            {
                throw;
            }
            finally
            {
                BarcodeWriter.DefaultWidth = 250;
            }
        }

        #endregion 生成Code128

        #region 解析Code128

        public string AnalysisCode128(Image image)
        {
            #region 校验

            Contract.Requires(image != null, "Code128识别图片不能为空");

            #endregion 校验

            try
            {
                return BarcodeReader.QuicklyReadOneBarcode(image, BarcodeEncoding.Code128).Text;
            }
            catch (Exception ex) when (ex.Log()) { return null; }
            catch
            {
                throw;
            }
        }

        #endregion 解析Code128

        #region 生成DataMatrixCode 

        public Image CreateDataMatrixCode(string code)
        {
            #region 校验

            Contract.Requires(!string.IsNullOrEmpty(code), "二维码内容不能为空");
            Contract.Requires(Encoding.Default.GetBytes(code).Length < 1500, "二维码容量不超过1500字节");

            #endregion 校验

            try
            {
                return BarcodeWriter.CreateBarcode(code, BarcodeWriterEncoding.DataMatrix).Image;
            }
            catch (Exception ex) when (ex.Log()) { return null; }
            catch
            {
                throw;
            }
        }

        #endregion 生成DataMatrixCode 

        #region 解析DataMatrixCode 

        public string AnalysisDataMatrixCode(Bitmap image)
        {
            #region 校验

            Contract.Requires(image != null, "二维码识别图片不能为空");

            #endregion 校验

            try
            {
                return BarcodeReader.QuicklyReadOneBarcode(image, BarcodeEncoding.DataMatrix).Text;
            }
            catch (Exception ex) when (ex.Log()) { return null; }
            catch
            {
                throw;
            }
        }

        #endregion 解析DataMatrixCode 

        #endregion 方法
    }
}

 

posted @ 2021-07-19 10:33  慢慢zero  阅读(1397)  评论(0)    收藏  举报