C#生成条码
一 技术目标
实现C#生成QR二维码,Code128条形码和DM二维码,以及上述三种条码的解析。
二 技术过程
- 二维码
二维码中,我们最常使用的是QR条码,广泛的存在于我们生活中,如:支付宝,微信扫码,而工业上,使用频率较高的也包括DM码。
两种码形的出现背景,具体区别,我在这里就不在追溯了,主要是如何在C#中生成和解析。
QR码的生成,在C#中是比较简单的,如果你上网进行搜索,一般会找到QRCoder,ThoughtWorks.QRCode等组件,但是QRCoder是不带有解析方法的。
- 条形码
条形码中,码形更加多,最常用的必属于Code128,所以这里只讨论Code128的生成和解析,网络上的资源,寻找的时候,组件包括BarcodeLib这些,
- 统一组件
经过上面的分析,发现在不同条码生成的过程中,有很多组件选择,那么有没有一种可以统一所有码形的组件呢?
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 方法 } }

浙公网安备 33010602011771号