生成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条码并识别(一)相关推荐

  1. 条码软件如何批量制作A级EAN 13条码

    打开中琅条码软件,在文档设置窗口,点击"纸张"选项卡,纸张下拉选项选择"自定义大小",然后设置纸张尺寸. 然后选择"布局"选项卡,手工设置一 ...

  2. 如何将EAN 13码批量输出成图片

    EAN是标准条形码,目前商店里大多数商品上都打有此码.EAN广泛用于便利店里的POS系统中.由于EAN和美国.加拿大的UPC,日本的JAN兼容,是世界通用的条形码.EAN13码是由前缀码.厂商识别码. ...

  3. 小猪的Python学习之旅 —— 13.文字识别库pytesseract初体验

    小猪的Python学习之旅 -- 13.文字识别库pytesseract初体验 标签:Python 引言 度过了短暂的春节假期,又要开始继续搬砖了,因为还处于节后 综合征,各种散漫,不想看任何代码相关 ...

  4. Python+TensorFlow+PyQt实现手写体数字图片识别+GUI界面+画板数字识别

    __pycache__文件夹是Python自动生成的,详细了解https://blog.csdn.net/yitiaodashu/article/details/79023987 其他各个文件在之后部 ...

  5. Python 【生成二维码和条形码】

    一.概述 最近在学习Python , 编写了一个能生成二维码和条形码的窗体.利用窗体上的输入Entrance,可以输入需要编码的原始数据,分别点击按钮可以生成二维码和条形码.分别点击窗体上的按钮,预览 ...

  6. python多线程挂了_python多线程输入的问题 python高效编程技巧13(如何在线程之间实现...

    python3 创建线程时不用args传参,执行线程时为什如果创建线程时在target里就传入了参数,为什么在启动线程时,线程不是在Python多线程下,每个线程的执行方式: 有什么了不起,大不了继续 ...

  7. 使用sphinx快速为你python注释生成API文档

    sphinx简介 sphinx是一种基于Python的文档工具,它可以令人轻松的撰写出清晰且优美的文档,由Georg Brandl在BSD许可证下开发.新版的Python3文档就是由sphinx生成的 ...

  8. 中boxplot函数的参数设置_如何在Python中生成图形和图表

    在本章中,我们将学习如何在Python中生成图形和图表,同时将使用函数和面向对象的方法来可视化数据. Python中常用的一些可视化数据包括以下几种. Matplotlib. Seaborn. ggp ...

  9. python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集)

    在PDMS中使用python直接生成管口方位图(开源分享第三集) 距离上一次发推送已有5个月之久,上周立了冬,这二季我为五斗米折了腰,最近才缓过气来. 令我没想到的是,大家竟然对这个主题这么有兴趣,有 ...

  10. 在python中设置密码登录_在python中生成密码

    在python中生成密码 我想在python中生成一些字母数字密码. 一些可能的方法是: import string from random import sample, choice chars = ...

最新文章

  1. jdbc与hibernate的优缺点比较
  2. python yield用法
  3. Kubernetes — CNI 规范
  4. oracle db file sequential read,db file sequential read等待事件
  5. c语言字符串加减_C语言中指针的介绍
  6. 计算机动漫设计VR主要学什么,动漫设计专业学什么 要学什么软件
  7. 使用TDengine快速搭建运维监测系统
  8. VB 字符串续行符最多25行…………
  9. 如何在SQL Server中使用数据质量服务清除主数据服务数据
  10. ROS入门 小乌龟跟随示例
  11. [Android开发]zip文件压缩解压缩
  12. Maven编译时跳过Test
  13. 39. 后台模块开发(4)
  14. XJOI1226 走迷宫
  15. C#+sqlserve实现登陆界面
  16. 测试 软通动力软件测试机试_软通动力2020春招软件测试笔试题以及答案
  17. 科研——谷歌学术使用方法
  18. OA流程归档后,没有推送消息通知这样处理
  19. Google Safe Browsing API的使用
  20. Unit 1: Packet Sniffing 1.1 Packet Sniffing Packet Sniffing Demos 1

热门文章

  1. sched_setscheduler
  2. H5页面背景音乐,C33 360°旋转效果
  3. JAVA基础Idea、方法
  4. 如何使用vlookup+excel数组公式 完成逆向查找?
  5. 找不到原始安装光盘的佳能EOS Utility的下载和安装
  6. 基于keras与tensorflow手工实现ResNet50网络
  7. “会员制营销”和“EMAIL营销”培训方案
  8. 建立第一个Power Apps程序(新手版)
  9. 2018高中计算机教学计划,上海市高中2018学年度课程计划说明
  10. 一文彻底搞懂逻辑回归模型