Python实现生成EAN-13条码并识别(一)
生成EAN-13码
生成一维条码的思路较为简单,就是先将输入的数据按照相应的规则编成代码。首先我们来了解一下EAN-13条形码。
EAN-13码由左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区及供人识别字符组成。
左侧空白区
:位于条码符号最左侧与空的反射率相同的区域,其最小宽度为11个模块宽。
起始符
:位于条码符号左侧空白区的右侧,表示信息开始的特殊符号,由3个模块组成。
左侧数据符
:位于起始符右侧,表示6位数字信息的一组条码字符,由42个模块组成。
中间分隔符
:位于左侧数据符的右侧,是平分条码字符的特殊符号,由5个模块组成。
右侧数据符
:位于中间分隔符右侧,表示5位数字信息的一组条码字符,由35个模块组成。
校验符
:位于右侧数据符的右侧,表示校验码的条码字符,由7个模块组成。
终止符
:位于条码符号校验符的右侧,表示信息结束的特殊符号,由3个模块组成。
右侧空白区
:位于条码符号最右侧的与空的反射率相同的区域,其最小宽度为7个模块宽。
这里的模块指的是单位长度,每一条码数据字符由2个条和2个空构成,每一条或空由1~4个模块组成,每一条码字符的总模块数为7。用二进制“1”表示条的模块,用二进制“0”表示空的模块。
那么什么时候用A子集,什么时候用B子集呢?这都是由前置码决定的。
我编的EAN-13条码前缀默认为69,也就是说前缀码为6,左侧数据符对应使用的字符集为“ABBBAA”,而右侧数据符则都使用C子集。
我们都明白了数据字符应该如何表示,校验符又是啥?
校验符的作用是检验前面12个数字是否正确,在条码机每次读入数据时,都会计算一次数据符的校验并与校验符进行比对。
校验符的计算方法非常简单,从校验符(第1位)从右向左起将所有的奇数位
相加得出一个数a,将所有的偶数位
相加得出一个数b,然后将数b乘以3再与a相加得到数c,用10减去数c的个位数,如果结果不为10则检验符为结果本身,如果为10则检验符为0。
校验符只需要我们按照规则计算就好了,非常简单。需要注意的是校验码也被包含在位数内!!
编出来的结果就是一串由0和1组成的字符串。将结果逐个遍历,如果是1就画一个黑色的细长矩形,如果是0就画一个白色的矩形,间距调小一点就是一个能被识别的条形码啦!
关键代码如下:
#这是用来绘图的库
import matplotlib.pyplot as plt
import matplotlib.patches as patchesrule=[0,1,1,1,0,0,2,2,2,2,2,2] #不同位置选用的字符集 0-A 1-B 2-Ccharset=[ #数字对应的条空组合 0为空 "0001101","0100111","1110010","0011001","0110011","1100110","0010011","0011011","1101100","0111101","0100001","1000010","0100011","0011101","1011100","0110001","0111001","1001110","0101111","0000101","1010000","0111011","0010001","1000100","0110111","0001001","1001000","0001011","0010111","1110100"
]def generate_barcode(nums): #生成条码#前缀有两位,除了6还剩一个9也需要进行编码nums=str(9)+nums global resodd,even = 6, 0 #奇数位和 偶数位和for i in range(len(nums)):if i == 0:res += "00101" #添加起始符if i == 6:res += "01010" #添加中间分隔符if i % 2 == 1:odd += int(nums[i])else:even += int(nums[i])idx = int(nums[i]) *3 + rule[i]res += charset[idx]sum = even *3 + oddcheckcode = 10 - sum % 10 #求校验码res += charset[checkcode*3 + 2]res += "10100" #添加结束符print(res)fig1 = plt.figure(figsize=(7, 7))ax1 = fig1.add_subplot(111, aspect='equal')plt.axis('off') #将轴线与刻度隐藏plt.xticks([])plt.yticks([])x = 0.04#参数:Rectangle(xy, width, height, angle=0.0, **kwargs)for i in range(len(res)):if res[i] == "0":ax1.add_patch(patches.Rectangle((x, 0.2), 0.009, 0.5, facecolor="white"))if res[i] == "1":ax1.add_patch(patches.Rectangle((x, 0.2), 0.009, 0.5, facecolor="black"))x += 0.009fig1.savefig('barcode.png', dpi=90, bbox_inches='tight')
欢迎大家讨论交流!
下一篇讲讲如何识别我们识别我们本节绘制的条码,敬请关注。
Python实现生成EAN-13条码并识别(一)相关推荐
- 条码软件如何批量制作A级EAN 13条码
打开中琅条码软件,在文档设置窗口,点击"纸张"选项卡,纸张下拉选项选择"自定义大小",然后设置纸张尺寸. 然后选择"布局"选项卡,手工设置一 ...
- 如何将EAN 13码批量输出成图片
EAN是标准条形码,目前商店里大多数商品上都打有此码.EAN广泛用于便利店里的POS系统中.由于EAN和美国.加拿大的UPC,日本的JAN兼容,是世界通用的条形码.EAN13码是由前缀码.厂商识别码. ...
- 小猪的Python学习之旅 —— 13.文字识别库pytesseract初体验
小猪的Python学习之旅 -- 13.文字识别库pytesseract初体验 标签:Python 引言 度过了短暂的春节假期,又要开始继续搬砖了,因为还处于节后 综合征,各种散漫,不想看任何代码相关 ...
- Python+TensorFlow+PyQt实现手写体数字图片识别+GUI界面+画板数字识别
__pycache__文件夹是Python自动生成的,详细了解https://blog.csdn.net/yitiaodashu/article/details/79023987 其他各个文件在之后部 ...
- Python 【生成二维码和条形码】
一.概述 最近在学习Python , 编写了一个能生成二维码和条形码的窗体.利用窗体上的输入Entrance,可以输入需要编码的原始数据,分别点击按钮可以生成二维码和条形码.分别点击窗体上的按钮,预览 ...
- python多线程挂了_python多线程输入的问题 python高效编程技巧13(如何在线程之间实现...
python3 创建线程时不用args传参,执行线程时为什如果创建线程时在target里就传入了参数,为什么在启动线程时,线程不是在Python多线程下,每个线程的执行方式: 有什么了不起,大不了继续 ...
- 使用sphinx快速为你python注释生成API文档
sphinx简介 sphinx是一种基于Python的文档工具,它可以令人轻松的撰写出清晰且优美的文档,由Georg Brandl在BSD许可证下开发.新版的Python3文档就是由sphinx生成的 ...
- 中boxplot函数的参数设置_如何在Python中生成图形和图表
在本章中,我们将学习如何在Python中生成图形和图表,同时将使用函数和面向对象的方法来可视化数据. Python中常用的一些可视化数据包括以下几种. Matplotlib. Seaborn. ggp ...
- python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集)
在PDMS中使用python直接生成管口方位图(开源分享第三集) 距离上一次发推送已有5个月之久,上周立了冬,这二季我为五斗米折了腰,最近才缓过气来. 令我没想到的是,大家竟然对这个主题这么有兴趣,有 ...
- 在python中设置密码登录_在python中生成密码
在python中生成密码 我想在python中生成一些字母数字密码. 一些可能的方法是: import string from random import sample, choice chars = ...
最新文章
- jdbc与hibernate的优缺点比较
- python yield用法
- Kubernetes — CNI 规范
- oracle db file sequential read,db file sequential read等待事件
- c语言字符串加减_C语言中指针的介绍
- 计算机动漫设计VR主要学什么,动漫设计专业学什么 要学什么软件
- 使用TDengine快速搭建运维监测系统
- VB 字符串续行符最多25行…………
- 如何在SQL Server中使用数据质量服务清除主数据服务数据
- ROS入门 小乌龟跟随示例
- [Android开发]zip文件压缩解压缩
- Maven编译时跳过Test
- 39. 后台模块开发(4)
- XJOI1226 走迷宫
- C#+sqlserve实现登陆界面
- 测试 软通动力软件测试机试_软通动力2020春招软件测试笔试题以及答案
- 科研——谷歌学术使用方法
- OA流程归档后,没有推送消息通知这样处理
- Google Safe Browsing API的使用
- Unit 1: Packet Sniffing 1.1 Packet Sniffing Packet Sniffing Demos 1