Генерация и чтение штрихкодов в Python

Штрихкод — это последовательность параллельных чёрных полос разной ширины, используемая для визуального представления данных в формате, пригодном для машинного считывания. Штрихкоды применяются для идентификации товаров, управления запасами и отслеживания партий в разных отраслях.
С Python можно автоматически генерировать штрихкоды в виде изображений, а также считывать и декодировать их с камер и файлов.
Что вы получите из статьи
- Пошаговая инструкция по установке и использованию python-barcode и pyzbar.
- Полный рабочий пример генерации и кастомизации штрихкода.
- Скрипты для сканирования изображений и потока с веб‑камеры.
- Советы по отладке, альтернативные библиотеки и роль‑ориентированные чек‑листы.
Установка библиотек
Установите необходимые пакеты и зависимости. Для генерации используйте python-barcode; для чтения — zbar + pyzbar и OpenCV.
Примеры команд (Mac / Linux / pip):
# Mac OS
brew install zbar
# Linux (Debian/Ubuntu)
sudo apt-get install libzbar0
# Python зависимости
pip install python-barcode pillow pyzbar opencv-python qrcodeПримечание: для некоторых окружений может потребоваться установка пакетов, обеспечивающих работу Pillow или Ghostscript (если используете treepoem).
Генерация штрихкодов
python-barcode предоставляет классы для разных форматов: Code39, Code128, EAN13, ISBN и другие. Для вывода в виде изображения используйте ImageWriter.
Импорт модулей и функция генерации
import barcode
from barcode.writer import ImageWriter
def generate_barcode(data, barcode_format, options=None, filename="barcode"):
"""Сгенерировать штрихкод и сохранить в файл.
data: строка с данными, barcode_format: например "code128", options: словарь опций writer.
"""
# Получаем класс для указанного формата
barcode_class = barcode.get_barcode_class(barcode_format)
# Создаём объект штрихкода с ImageWriter для вывода в PNG
barcode_image = barcode_class(data, writer=ImageWriter())
# Сохраняем изображение (расширение зависит от writer)
barcode_image.save(filename, options=options)Пример вызова:
generate_barcode("MakeUseOf", "code128")Кастомизация внешнего вида
Writer принимает набор опций: цвета, шрифты, размеры модулей, отступы и текст под штрихкодом. Конкретный набор опций зависит от версии python-barcode и ImageWriter (Pillow).
Пример с несколькими опциями:
generate_barcode(
"MakeUseOf",
"code128",
options={
"foreground": "red", # цвет штрихов
"center_text": False, # отключить подпись в центре
"module_width": 0.4, # ширина базового модуля
"module_height": 20 # высота полос
},
filename="custom_barcode"
)Совет: экспериментируйте с module_width и module_height, чтобы получить оптимальное соотношение для принтера и камеры.
Сканирование и декодирование штрихкодов
Для декодирования штрихкодов удобно использовать pyzbar — это обёртка над zbar, которая поддерживает множество типов одно‑ и двухмерных кодов.
Импорты и функция для изображения
import cv2
from pyzbar import pyzbar
def scan_barcode_from_image(image_path):
# Читаем изображение через OpenCV
image = cv2.imread(image_path)
# Декодируем найденные штрихкоды
barcodes = pyzbar.decode(image)
for barcode in barcodes:
barcode_data = barcode.data.decode("utf-8")
barcode_type = barcode.type
print("Barcode Data:", barcode_data)
print("Barcode Type:", barcode_type)Пример вывода:
> Barcode Data: MakeUseOf
> Barcode Type: CODE128Сканирование из потока с веб‑камеры
def scan_barcode_from_webcam():
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
if not ret:
break
barcodes = pyzbar.decode(frame)
for barcode in barcodes:
barcode_data = barcode.data.decode("utf-8")
barcode_type = barcode.type
print("Barcode Data:", barcode_data)
print("Barcode Type:", barcode_type)
# Нажмите 'q' для выхода
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
# Запустить сканирование
# scan_barcode_from_webcam()Советы по надёжному сканированию:
- Освещение: равномерный рассеянный свет без бликов.
- Контраст: чёрные штрихи и светлый фон дают лучший результат.
- Разрешение: снимайте при достаточном разрешении и фокусе.
Генерация QR‑кодов
QR‑код — двумерный штрихкод. Для простого создания QR‑кодов используйте библиотеку qrcode (Pillow требуется для вывода в изображение):
import qrcode
img = qrcode.make('https://example.com')
img.save('qrcode.png')Для сканирования QR‑кодов pyzbar также поддерживает их декодирование из изображений и видеопотока.
Когда подход может не сработать
- Повреждённая или частично закрытая метка: декодер может вернуть ошибку или неверные данные.
- Низкое разрешение изображения или сильные блики: невозможно выделить модули.
- Специфические защищённые или брендированные штрихкоды с непривычной разметкой: может потребоваться кастомный парсер.
Альтернативные подходы и библиотеки
- treepoem — генерирует штрихкоды через Ghostscript; полезно для профессиональной печати. Требует установленного Ghostscript.
- python-barcode + Pillow — простое решение для большинства задач по генерации.
- ZBar, ZXing — альтернативные движки для распознавания (есть порты и биндинги).
Мини‑методология внедрения в проект
- Прототип: сгенерируйте штрихкод и считайте его локально.
- Автоматизация: интегрируйте генерацию в CI/скрипты сборки этикеток.
- Тестирование: проверьте печать и считывание на реальном оборудовании.
- Мониторинг: логируйте неуспешные сканирования и повторные попытки.
Роль‑ориентированные чек‑листы
- Для разработчика:
- Установить зависимости и проверить примеры.
- Добавить обработку ошибок при чтении/сохранении.
- Для тестировщика:
- Проверить штрихкоды на различных принтерах и камерах.
- Проверить поведение при повреждении этикетки.
- Для DevOps:
- Автоматизировать установку зависимостей (apt/brew/pip).
- Следить за версиями библиотек и совместимостью форматов.
Краткий глоссарий
- Штрихкод: одномерный код из параллельных полос, отражающий данные.
- QR‑код: двумерный матричный код для хранения больших объёмов данных.
- Writer: компонент, который рендерит штрихкод в изображение или SVG.
Безопасность и приватность
- Доступ к веб‑камере требует разрешений — уважайте приватность пользователей.
- Если штрихкоды содержат персональные данные, применяйте правила защиты данных и минимизации хранения.
Важно: не сохраняйте чувствительную информацию в открытом виде в штрихкоде без шифрования и согласия владельца данных.
Отладка и частые ошибки
- «NoneType» при чтении изображения: путь к файлу неверен — проверьте cv2.imread.
- Не найден формат при генерации: убедитесь, что имя формата поддерживается (code128, ean13 и т.д.).
- Низкая точность сканирования: увеличьте module_width/module_height или улучшите освещение.
Краткое резюме
Генерация и чтение штрихкодов в Python — простая и практичная задача при помощи python-barcode, Pillow, pyzbar и OpenCV. Начните с прототипа: сгенерируйте изображение, отладьте печать и проверьте сканирование с разных устройств. Встроенные опции writer позволяют гибко настраивать внешний вид, а альтернативные библиотеки дают дополнительные возможности для печати и сложных форматов.
Ключевые шаги: установка зависимостей, генерация с ImageWriter, декодирование через pyzbar, тестирование на камере/принтере.
Похожие материалы
Автозаполнение паролей на iPhone и iPad
Отключить звуки корзины и скриншота на Mac
Instagram Topics для Reels — как добавить и использовать
Контейнеризация Node.js и PostgreSQL с Docker
Как защитить Android‑телефон — быстрый чеклист