前言:需要的包的相关文档
1. Barcode:https://pypi.org/project/python-barcode/0.8.1/
2. Qrcode:https://pypi.org/project/qrcode/
3. Zbar: https://pypi.org/project/pyzbar/
4. Opencv: https://docs.opencv.org/3.4.11/
5. OpenCV: https://blog.csdn.net/JsonD/article/details/84983702
本次用python实现条形码和二维码的制作,同时也对最近学习的总价
Barcode库
制作ean13码
导包
import barcode
from barcode.writer import ImageWriter
这里要注意的是下载的包方式是
pip install python-barcode包
否则from barcode.writer import ImageWriter无法正常使用
指明类型
EAN=barcode.get_barcode_class('ean13')
写入内容
ean = EAN(u'4260165185431',writer=ImageWriter())
保存
ean.save('ean13')
完整代码
import barcode
from barcode.writer import ImageWriter
EAN=barcode.get_barcode_class('ean13')
ean = EAN(u'4260165185431',writer=ImageWriter())
ean.save('ean13')
code39码制作
方法跟上述的ean13码制作方式类同,只需改变类型指向为code39
完整代码
import barcode
from barcode.writer import ImageWriter
EAN=barcode.get_barcode_class('code39')
ean = EAN(u'4260165185431',writer=ImageWriter())
ean.save('code39')
Numpy库与cv2库
现在我们提出一个需求就是不借助 Barcode库也能实现,加密ean13码的制作
我们老师的要求是:仅使用opencv库和numpy库,在给定EAN-13码中国家代码、厂商代码、产品代码后,自动生成EAN-13码的数字内容和对应的条码图片。其中设置图片大小为565*400,条形码每个编码单元宽度5像素,短条长度为346像素,长条长度为371像素。
思路:通过枚举的方式制作
#!/usr/bin/env python
# -- coding: utf-8 --
# @Time : 2023/3/12 12:12
# @File : ean-13.py
import cv2
import numpy as npdef generate_ean13_code(country_code, manufacturer_code, product_code):# 计算校验码ean13_code = country_code + manufacturer_code + product_codecheck_code =str((10 - (3*int(ean13_code[0])+int(ean13_code[1])+3*int(ean13_code[2])+int(ean13_code[3])+3*int(ean13_code[4])+int(ean13_code[5])+3*int(ean13_code[6])+int(ean13_code[7])+3*int(ean13_code[8])+int(ean13_code[9])+3*int(ean13_code[10])+int(ean13_code[11])) % 10))ean13_code += check_code# 生成数字内容图像num_image = np.ones((50, 565, 3), dtype=np.uint8) * 255cv2.putText(num_image, ean13_code, (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)# 生成条形码图像code_image = np.ones((346, 565, 3), dtype=np.uint8) * 255# 生成左侧6个数字的条形码for i in range(6):binary_code = '{0:07b}'.format(int(ean13_code[i]))for j, bit in enumerate(binary_code):if bit == '1':cv2.rectangle(code_image, (5+(j+i*7)*5, 0), (5+(j+i*7)*5+5, 346), (0, 0, 0), -1)# 中间加入间隔线cv2.rectangle(code_image, (35*5, 0), (35*5+5, 346), (255, 255, 255), -1)# 生成右侧6个数字的条形码for i in range(6, 12):binary_code = '{0:07b}'.format(int(ean13_code[i]))for j, bit in enumerate(binary_code):if bit == '1':cv2.rectangle(code_image, (40+(j+(i-6)*7)*5, 0), (40+(j+(i-6)*7)*5+5, 346), (0, 0, 0), -1)# 合并数字内容和条形码图像code_image = np.concatenate((code_image,num_image), axis=0)return ean13_code, code_image# 示例调用
code, image = generate_ean13_code('123', '4567', '7654321')
cv2.imshow('EAN-13 Code: {}'.format(code), image)
cv2.waitKey(0)
cv2.imwrite('me.png',image)
cv2.destroyAllWindows()
存在bug,应该是生成130多个小方块。进优势,后面在调试
CV2
这里我们运用到用于计算的numpy库和图片处理的CV2库,numpy库我们之前用过,那么cv2库呢。python版OpenCV常用api调用 (这一版很全)_opencv python api_黑暗骑士V的博客-CSDN博客
知道了使用的方法,我们再做一个案例
现在这个效果,这个我们就要计算了
import numpy as np
import cv2img=np.zeros((200,400,3),np.uint8)
# 最后以为0 代表的是蓝通道 1代表的是绿通道 2代表红通道
img[0:100,0:200,0]=255
# 第一个参数是高度 第二个是宽度
img[100:200,0:200,1]=255
# 灰
img[0:100,200:400,0]=128
img[0:100,200:400,1]=128
img[0:100,200:400,2]=128img[100:200,200:400,2]=255cv2.imshow('color',img)
cv2.waitKey(0)
这个img[0:100,0:200,0]==img[高度,宽度,通过值]
0 代表的是蓝通道 1代表的是绿通道 2代表红通道
Qrcode
qrcode库主要是用来做二维码的库,像我以前用Java写一个二维码,要几百行才能实现,这个就几步实现了
现在给一个需求,我要一个链接到百度的二维码,而且二维码的前景色为蓝色
#!/usr/bin/env python
# -- coding: utf-8 --
# @Time : 2023/3/14 14:30
# @File : Qrcode.py
import qrcode
# 二维码内容
content = 'http://www.baidu.com/'
# 二维码配置
qr3 = qrcode.QRCode(version=10,error_correction=qrcode.constants.ERROR_CORRECT_Q,box_size=5,border=6,
)
# 添加数据
qr3.add_data(content)
# 转存写入
qr3.make(fit=True)
# 图片样式
img3 = qr3.make_image(fill_color="#00BFFF", back_color="#FFFFFF")
# 保存图片
img3.save('qr3.png')
Zbar库
这里要注意的zbar库已经弃用了现在用pyzbar库
这是一个解码库,我们解之前bacode库生成的39码内容
#!/usr/bin/env python
# -- coding: utf-8 --
# @Time : 2023/3/14 14:39
# @File : Pyzbar.py
import cv2
from pyzbar import pyzbar
# 读图片
img = cv2.imread('code39.png')
# 解码条码
decoded_objects = pyzbar.decode(img)
# 打印解码结果
for obj in decoded_objects:print('Type:', obj.type)print('Data:', obj.data.decode())