背景
上册测试自助收银机条形码的时候,发现条形码没有保存下来,每次都要看开图片看看,重复的事情交给程序去做吧
需求
读取png图片,识别条形码即可
方案
python 3.8以上
pyzbar 0.1.9
pillow 10.3.0
在Mac上安装pyzbar
库,通常需要先确保zbar
的系统库已经安装在你的系统上。以下是在Mac上安装zbar
和pyzbar
的步骤:
-
首先,你需要安装Homebrew,它是一个MacOS和Linux的包管理器。如果你还没有安装,请访问Homebrew官网并按照指示进行安装。
-
使用Homebrew安装
zbar
库: -
brew install zbar
代码
定义了一个名为 read_barcodes_in_folder
的函数,该函数接受一个参数 folder_path
,表示要读取条形码的文件夹路径。
在函数内部,使用 os.listdir(folder_path)
遍历文件夹中的所有文件。对于每个以 ".png" 结尾的文件名,构建完整的文件路径 image_path
。
def read_barcodes_in_folder(folder_path):
"""
读取文件夹中所有 PNG 图像文件中的一维条形码
:param folder_path: 文件夹路径
"""
# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
if filename.endswith(".png"):
# 构建完整的文件路径
image_path = os.path.join(folder_path, filename)
接下来,使用 Image.open(image_path)
打开图像文件,并将其保存在变量 barcode_image
中。
然后,调用 decode(barcode_image)
函数来解码条形码,并将结果保存在 decoded_objects
变量中。
如果 decoded_objects
不为空,说明在当前图像文件中检测到了条形码。程序会打印出文件名,并逐个输出解码后的条形码数据。
如果 decoded_objects
为空,说明在当前图像文件中没有检测到条形码。程序会打印出相应的提示信息。
# 读取图像文件
barcode_image = Image.open(image_path)
# 解码条形码
decoded_objects = decode(barcode_image)
if decoded_objects:
print(f"File: {filename}")
for obj in decoded_objects:
print("Data:", obj.data.decode('utf-8'))
else:
print(f"No barcode detected in {filename}.")
最后,定义了一个变量 folder_path
,表示要读取条形码的文件夹路径。然后调用 read_barcodes_in_folder(folder_path)
函数来执行读取操作。
这段代码的作用是遍历指定文件夹中的所有 PNG 图像文件,并尝试从中解码一维条形码。如果成功解码,将打印出文件名和解码后的数据;如果没有检测到条形码,则打印出相应的提示信息。
源码
import os
from pyzbar.pyzbar import decode
from PIL import Image
def read_barcodes_in_folder(folder_path):
"""
读取文件夹中所有 PNG 图像文件中的一维条形码
:param folder_path: 文件夹路径
"""
# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
if filename.endswith(".png"):
# 构建完整的文件路径
image_path = os.path.join(folder_path, filename)
# 读取图像文件
barcode_image = Image.open(image_path)
# 解码条形码
decoded_objects = decode(barcode_image)
if decoded_objects:
print(f"File: {filename}")
for obj in decoded_objects:
print("Data:", obj.data.decode('utf-8'))
else:
print(f"No barcode detected in {filename}.")
# 图像文件夹路径
folder_path = "barcodes"
# 读取文件夹中所有 PNG 图像文件中的一维条形码
read_barcodes_in_folder(folder_path)