Barcode、QrCode原理及用Python生成条形码、二维码


在 Python 中,你可以使用python-barcode库来生成条码,使用qrcode库生成二维码,然后使用Pillow库将生成的code123、ean13条码或qrcode二维码显示出来。

简介

  1. Code 128 码是一种一维条码,由美国的 Intermec 公司于 1981 年开发。它能够对数字、字母和符号进行编码,可表示 ASCII 码中从 32 到 126 的 128 个字符,这也是它被称为 Code 128 码的原因。
  2. EAN13 码即国际物品编码协会(EAN)制定的一种商品用条码,也称为通用商品条码,由 13 位数字组成,是目前全球使用最广泛的商品标识条码之一。
  3. 二维码
    二维码,又称二维条码,是在一维条码的基础上发展而来的一种图形化编码技术,它能够在横向和纵向两个维度上同时存储信息,具有更高的数据容量和更强的纠错能力。

CODE128条码

介绍

特点

  1. 高密度:Code 128 码可以在较小的空间内容纳大量的数据,相较于其他一些一维条码,它能以更紧凑的方式编码信息,从而节省标签空间。
  2. 高容量:能够编码较多的字符,最多可编码 48 个 ASCII 字符,适合对较长数据进行编码。
  3. 可变性:有三种不同的字符集(A、B、C)可供选择,并且可以在条码符号中根据需要切换字符集,以实现对不同类型数据的高效编码。
  4. 校验功能:Code 128 码包含一个校验位,用于检测条码在扫描过程中可能出现的错误,提高了数据传输的准确性和可靠性。
    编码规则

字符集

  1. 字符集 A:包含大写字母、数字 0 - 9、控制字符(如换行符、制表符等)以及一些特殊符号,适用于编码包含控制字符和大写字母的数据。
  2. 字符集 B:包含大小写字母、数字 0 - 9 以及一些特殊符号,适用于编码包含大小写字母和数字的数据。
  3. 字符集 C:仅包含数字 00 - 99,可将两个数字编码为一个条码字符,对于纯数字数据的编码效率更高。

起始符和终止符

每个 Code 128 码都以一个起始符开始,根据所使用的字符集不同,起始符有三种类型(起始符 A、起始符 B、起始符 C)。条码的末尾是一个终止符,用于表示条码的结束。

校验位

校验位是根据条码数据和起始符计算得出的一个字符,用于验证条码的准确性。计算方法是将每个字符的权重乘以其对应的字符值,然后将所有结果相加,再对 103 取模得到校验位的值。

python实现

  1. 安装依赖库
    首先确保你已经安装了 python-barcode 和 Pillow 库,如果未安装,可以使用以下命令进行安装:
pip install python-barcode pillow
  1. 生成 CODE128 条码
    CODE128 是一种高密度的条码,可编码数字、字母和符号。以下是生成 CODE128 条码的示例代码:
    有多种写法
    一种
 txt = '12345H'
 bar_class = get_barcode_class('code128')
 ean = bar_class(txt, writer=ImageWriter())
 fullname = ean.save("./条形码")

 pix = QPixmap(fullname)
 #self.barCodelabel.setPixmap(pix)

另一种

from barcode import Code128
from barcode.writer import ImageWriter

def generate_code128_barcode(data):
    # 创建 Code128 条码对象
    code = Code128(data, writer=ImageWriter())
    # 保存条码图片
    filename = code.save('code128_barcode')
    print(f"条码已保存为 {filename}")

if __name__ == "__main__":
    # 要编码的数据
    barcode_data = "12345H"
    generate_code128_barcode(barcode_data)

代码解释:
导入 Code128 类用于生成 CODE128 条码,ImageWriter 用于将条码保存为图片。
Code128(data, writer=ImageWriter()) 创建一个 CODE128 条码对象,data 是要编码的内容。
code.save(‘code128_barcode’) 将生成的条码保存为图片文件,文件名为 code128_barcode.png。
在这里插入图片描述

EAN13条码

介绍

编码结构

EAN13 码的 13 位数字有特定的含义,具体结构如下:

  1. 前缀码(前 3 位):由国际物品编码协会分配给各个国家或地区的编码组织,用于标识商品的原产国家或地区。例如,690 - 699 代表中国大陆地区。
  2. 厂商识别代码(接下来的 4 - 7 位):由所在国家或地区的编码组织分配给各个企业,用于标识生产该商品的企业。
  3. 商品项目代码(随后的 5 位):由企业自行分配,用于标识企业生产的不同商品项目。
  4. 校验码(最后 1 位):根据前面 12 位数字,按照特定的算法计算得出,用于检验条码扫描的准确性。

编码规则

  1. 数字与条码符号的对应:EAN13 码中的每个数字都对应着特定的条码模块组合,这些模块由宽条、窄条、宽空和窄空组成。条码阅读器通过识别这些宽窄不同的条和空来解码出对应的数字。
    校验码的计算:
  2. 从左到右,将第 1、3、5、7、9、11 位数字相加,得到奇数位数字之和。
  3. 将第 2、4、6、8、10、12 位数字相加,得到偶数位数字之和。
  4. 偶数位数字之和乘以 3,再加上奇数位数字之和。
  5. 用大于或等于上述结果且为 10 的最小整数倍的数减去该结果,得到的差就是校验码。

python实现

以下是详细的步骤和示例代码:
7. 安装所需库
首先,你需要安装python-barcode和Pillow库。可以使用pip命令进行安装:

pip install python-barcode pillow
  1. 示例代码
from barcode import EAN13
from barcode.writer import ImageWriter
from PIL import Image

def generate_and_display_barcode(code):
    # 生成EAN-13条码
    ean = EAN13(code, writer=ImageWriter())

    # 保存条码图片
    filename = ean.save('barcode')

    # 使用Pillow打开并显示条码图片
    img = Image.open(filename)
    img.show()

if __name__ == "__main__":
    # EAN-13条码需要12位数字,最后一位是校验位会自动生成
    barcode_code = '690123456789'
    generate_and_display_barcode(barcode_code)
  1. 代码解释
    导入必要的库:
    barcode.EAN13:用于生成 EAN-13 格式的条码。
    barcode.writer.ImageWriter:用于将条码保存为图片。
    PIL.Image:用于打开和显示生成的条码图片。
    定义生成和显示条码的函数:
    generate_and_display_barcode函数接受一个 12 位的数字字符串作为参数,用于生成 EAN-13 条码。
    EAN13类用于生成条码,writer=ImageWriter()指定将条码保存为图片。
    ean.save(‘barcode’)将生成的条码保存为图片文件,文件名为barcode.png。
    Image.open(filename)打开生成的图片文件,img.show()显示图片。
    主程序:
    定义一个 12 位的数字字符串barcode_code,调用generate_and_display_barcode函数生成并显示条码。
  2. 注意事项
    EAN-13 条码需要 12 位数字,最后一位是校验位会自动生成。
    除了 EAN-13 格式,python-barcode库还支持其他多种条码格式,如 CODE128、QR Code 等。你可以根据需要选择合适的条码格式。
    在这里插入图片描述

生成其他类型条码

python-barcode 还支持其他类型的条码,如 EAN8、UPCA 等,生成方法类似。以下是生成 EAN8 条码的示例代码:

from barcode import EAN8
from barcode.writer import ImageWriter

def generate_ean8_barcode(data):
    # 创建 EAN8 条码对象
    code = EAN8(data, writer=ImageWriter())
    # 保存条码图片
    filename = code.save('ean8_barcode')
    print(f"条码已保存为 {filename}")

if __name__ == "__main__":
    # EAN8 条码需要 7 位数字,最后一位是校验位会自动生成
    barcode_data = "1234567"
    generate_ean8_barcode(barcode_data)

QR Code二维码

介绍

结构特点

  1. 高密度编码:与一维条码相比,二维码可以在更小的面积内存储大量的数据。例如,常见的 QR 码(一种二维码)可以存储多达 7089 个数字或 4296 个字母和数字的组合。
  2. 纠错能力强:二维码具备一定的纠错功能,即使二维码部分损坏或污损,仍然可以通过纠错机制恢复出完整的数据。纠错级别通常分为 L(7% 纠错)、M(15% 纠错)、Q(25% 纠错)、H(30% 纠错)四个等级。
  3. 多种编码格式:常见的二维码格式有 QR 码、Data Matrix 码、PDF417 码等,不同的格式在编码规则、应用场景等方面可能会有所差异。

编码原理

  1. 数据编码:将要编码的数据(如文本、网址、联系方式等)按照一定的编码规则转换为二进制数据。
  2. 模块排列:根据二维码的格式和版本,将二进制数据转换为黑白相间的模块,并按照特定的规则排列在二维码的矩阵中。
  3. 添加辅助信息:为了保证二维码的正确识读,还需要在矩阵中添加一些辅助信息,如定位图案、校正图案、格式信息等。

python实现

  1. 首先需要安装 qrcode与pillow库:
pip install qrcode pillow
  1. 以下是生成 QR Code 的示例代码:
import qrcode
from qrcode.image.styledpil import StyledPilImage

def generate_qr_code(data):
    # 创建 QRCode 对象
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    # 添加数据到 QRCode 对象
    qr.add_data(data)
    qr.make(fit=True)
    # 生成二维码图片
    img = qr.make_image(image_factory=StyledPilImage)
    # 保存二维码图片
    img.save('qr_code.png')
    print("二维码已保存为 qr_code.png")

if __name__ == "__main__":
    # 要编码的数据
    qr_data = "Hello,World"
    generate_qr_code(qr_data)
  1. 代码解释:
    导入 qrcode 库和 StyledPilImage 用于生成带样式的二维码图片。
    创建 QRCode 对象,设置二维码的版本、纠错级别、方块大小和边框等参数。
    qr.add_data(data) 将要编码的数据添加到 QRCode 对象中,qr.make(fit=True) 生成二维码。
    qr.make_image(image_factory=StyledPilImage) 生成二维码图片,img.save(‘qr_code.png’) 将图片保存到本地。
    在这里插入图片描述
    作者:帅得不敢出门
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值