文档章节

C# 生成条形码、二维码随笔

o
 osc_fmg49rzg
发布于 2019/03/20 20:25
字数 1447
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、什么是条形码

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.条形码可以标出物品的生产国、制造厂商、商品名称、生产日期、日期等信息,因此得到了广泛应用.

条形码的编码规则

唯一性:同种规格同种产品对应同一个产品代码,同种产品不同规格应对应不同的产品代码.

永久性:产品代码已经分配,就不在更改,并且是终身的.

无含义:为了保证代码有足够的容量以适应产品频繁的更新换代的需要,最好采用无含义的顺序码。

一维条形码

一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于 阅读器的对准。
一维条形码的应用可以提高信息录入的速度,减少差错率,但是一维条形码也存在一些不足之处:
* 数据容量较小:30个字符左右
* 只能包含字母和数字
* 条形码尺寸相对较大(空间利用率较低)
* 条形码遭到损坏后便不能阅读

二维条形码

在水平和垂直方向的二维空间存储信息的条形码, 称为二维条形码(2-dimensional bar code)。
与一维条形码一样,二维条形码也有许多不同的编码方法,或称码制。就这些码制的编码原理而言,通常可分为以下三种类型:
线性堆叠式二维码、矩阵式二维码、邮政码

数字的含义

此条形码分为4个部分,从左到右分别为:
1-3位:共3位,对应该条码的693,是中国的国家代码之一。(690--695都是中国大陆的代码,由国际上分配)
4-8位:共5位,对应该条码的69838,代表着生产厂商代码,由厂商申请,国家分配
9-12位:共4位,对应该条码的0001,代表着厂内商品代码,由厂商自行确定
第13位:共1位,对应该条码的3,是校验码,依据一定的算法,由前面12位数字计算而得到。

二、通过ZXing.Net来实现条形码

在项目中,点击项目名称右键-->管理NuGet程序包,打开NuGet包管理器窗口,进行搜索下载即可,如下图所示:

如下所示,包含一维条码,二维条码,和带logo的条码实现代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Drawing;
  7 using ZXing;
  8 using ZXing.Common;
  9 using ZXing.QrCode;
 10 using ZXing.QrCode.Internal;
 11 using System.Drawing.Imaging;
 12 
 13 namespace WindowsFormsApp1
 14 {
 15     public class BarMethHepler
 16     {
 17         /// <summary>
 18         /// 生成二维码
 19         /// </summary>
 20         /// <param name="text">内容</param>
 21         /// <param name="width">宽度</param>
 22         /// <param name="height">高度</param>
 23         /// <returns></returns>
 24         public static Bitmap Generate1(string text, int width, int height)
 25         {
 26             BarcodeWriter writer = new BarcodeWriter();
 27             writer.Format = BarcodeFormat.QR_CODE;
 28             QrCodeEncodingOptions options = new QrCodeEncodingOptions()
 29             {
 30                 DisableECI = true,//设置内容编码
 31                 CharacterSet = "UTF-8",  //设置二维码的宽度和高度
 32                 Width = width,
 33                 Height = height,
 34                 Margin = 1//设置二维码的边距,单位不是固定像素
 35             };
 36 
 37             writer.Options = options;
 38             Bitmap map = writer.Write(text);
 39             return map;
 40         }
 41 
 42         /// <summary>
 43         /// 生成一维条形码
 44         /// </summary>
 45         /// <param name="text">内容</param>
 46         /// <param name="width">宽度</param>
 47         /// <param name="height">高度</param>
 48         /// <returns></returns>
 49         public static Bitmap Generate2(string text, int width, int height)
 50         {
 51             BarcodeWriter writer = new BarcodeWriter();
 52             //使用ITF 格式,不能被现在常用的支付宝、微信扫出来
 53             //如果想生成可识别的可以使用 CODE_128 格式
 54             //writer.Format = BarcodeFormat.ITF;
 55             writer.Format = BarcodeFormat.CODE_39;
 56             EncodingOptions options = new EncodingOptions()
 57             {
 58                 Width = width,
 59                 Height = height,
 60                 Margin = 2
 61             };
 62             writer.Options = options;
 63             Bitmap map = writer.Write(text);
 64             return map;
 65         }
 66 
 67         /// <summary>
 68         /// 生成带Logo的二维码
 69         /// </summary>
 70         /// <param name="text">内容</param>
 71         /// <param name="width">宽度</param>
 72         /// <param name="height">高度</param>
 73         public static Bitmap Generate3(string text, int width, int height)
 74         {
 75             //Logo 图片
 76             string logoPath = System.AppDomain.CurrentDomain.BaseDirectory + @"\img\logo.png";
 77             Bitmap logo = new Bitmap(logoPath);
 78             //构造二维码写码器
 79             MultiFormatWriter writer = new MultiFormatWriter();
 80             Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
 81             hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
 82             hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
 83             //hint.Add(EncodeHintType.MARGIN, 2);//旧版本不起作用,需要手动去除白边
 84 
 85             //生成二维码 
 86             BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, width + 30, height + 30, hint);
 87             bm = deleteWhite(bm);
 88             BarcodeWriter barcodeWriter = new BarcodeWriter();
 89             Bitmap map = barcodeWriter.Write(bm);
 90 
 91             //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
 92             int[] rectangle = bm.getEnclosingRectangle();
 93 
 94             //计算插入图片的大小和位置
 95             int middleW = Math.Min((int)(rectangle[2] / 3), logo.Width);
 96             int middleH = Math.Min((int)(rectangle[3] / 3), logo.Height);
 97             int middleL = (map.Width - middleW) / 2;
 98             int middleT = (map.Height - middleH) / 2;
 99 
100             Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
101             using (Graphics g = Graphics.FromImage(bmpimg))
102             {
103                 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
104                 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
105                 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
106                 g.DrawImage(map, 0, 0, width, height);
107                 //白底将二维码插入图片
108                 g.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
109                 g.DrawImage(logo, middleL, middleT, middleW, middleH);
110             }
111             return bmpimg;
112         }
113 
114         /// <summary>
115         /// 删除默认对应的空白
116         /// </summary>
117         /// <param name="matrix"></param>
118         /// <returns></returns>
119         private static BitMatrix deleteWhite(BitMatrix matrix)
120         {
121             int[] rec = matrix.getEnclosingRectangle();
122             int resWidth = rec[2] + 1;
123             int resHeight = rec[3] + 1;
124 
125             BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
126             resMatrix.clear();
127             for (int i = 0; i < resWidth; i++)
128             {
129                 for (int j = 0; j < resHeight; j++)
130                 {
131                     if (matrix[i + rec[0], j + rec[1]])
132                         resMatrix[i, j] = true;
133                 }
134             }
135             return resMatrix;
136         }
137     }
138 }

简单的练习

设计一个简单的条形码生成程序,主要的三个参数为内容、高度、宽度,再通过在后台调用BarMethHepler类中的Generate1()方法并传入参数就可获得条形码;

实现效果:

参考文献:

作者:Alan.hsiang
出处:http://www.cnblogs.com/hsiang/

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
C# vb .NET生成QR二维码

二维码比条形码具有更多优势,有些场合使用二维码比较多,比如支付。通过将某些数据生成二维码,就可以实现一码走天下。那么如何在C#,.Net平台代码里生成二维码呢?答案是使用SharpBarcode!...

osc_i5rnp27q
2019/10/13
16
0
c#教程之基于C#生成条形码操作知识汇总附源码下

1. 介绍 1.1 条形码 条形码(barcode):是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。 1.2 条形码分类 可分为一维条形码和二维条形码: 一维条形码...

Andrewniu
2019/06/04
0
0
C#条形码

条形码的三种维码却别: ①一维条形码: 一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准。 一维条形码的应用可...

osc_fmg49rzg
2019/03/20
3
0
.NET使用ZXing.NET生成中间带图片的二维码

很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客。 把之前的代码封装成函数,以方便理解以及调用。 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后...

osc_f5e60qdm
2018/06/06
32
0
基于Metronic的Bootstrap开发框架--资产编码打印处理

在开发业务管理系统的时候,往往涉及到资产信息及编码的打印处理,如我们需要对资产信息、条形码、二维码一起打印,以便贴在具体资产信息上面,方便微信公众号、企业微信进行业务处理,那么编...

osc_7zyqbo9l
2019/02/27
1
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊rocketmq-client-go的TraceInterceptor

序 本文主要研究一下rocketmq-client-go的TraceInterceptor TraceInterceptor rocketmq-client-go-v2.0.0/producer/interceptor.go // WithTrace support rocketmq trace: https://github.c......

go4it
49分钟前
0
0
如何在Android文本视图周围添加边框? - How do I put a border around an Android textview?

问题: 是否可以在textview周围绘制边框? 解决方案: 参考一: https://stackoom.com/question/EfXR/如何在Android文本视图周围添加边框 参考二: https://oldbug.net/q/EfXR/How-do-I-put...

法国红酒甜
今天
10
0
设计模式(4) 建造者模式

什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了...

zhixin9001
今天
14
0
ArrayList源码分析 —— JDK8

ArrayList的特性 ArrayList内部使用数据作为存储结构,ArrayList可以理解为数组的扩展对象,封装了常用的和非常用的操作数组的方法。以及当数组长度不足以保存数组时,自动扩容数组,通常Arr...

XuePeng77
今天
56
0
__slots__的用法? - Usage of __slots__?

问题: Python中__slots__的目的是什么-尤其是关于何时以及何时不使用它的目的? 解决方案: 参考一: https://stackoom.com/question/1ymu/slots-的用法 参考二: https://oldbug.net/q/1ym...

富含淀粉
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部