Генерация и сканирование штрихкодов в Python
Важное: все примеры кода можно запускать локально. Для работы с веб‑камерой убедитесь, что у вас есть доступ к устройству и установлены зависимости.
Что такое штрихкод
Штрихкод — это последовательность параллельных чёрных и белых полос разной ширины, предназначенная для визуального и машинного считывания. Штрихкоды кодируют информацию о товаре, артикуле или идентификаторе. QR‑код — это двумерный (матрицный) штрихкод, который хранит больше данных в квадратной форме.
Кратко: штрихкод — визуальное представление данных для быстрой автоматической идентификации.
Основные варианты применения
- Инвентаризация и складской учёт
- Маркирование товаров в ритейле
- Отслеживание отправлений и документов
- Внутренние идентификаторы (штрихкоды на деталях и изделиях)
Как генерировать и настраивать штрихкоды
Ниже показан пошаговый рабочий процесс с библиотекой python-barcode.
Установка библиотеки
Откройте терминал и установите python-barcode (и Pillow для сохранения в виде изображения):
pip install python-barcode PillowЕсли вы используете менеджер пакетов системы для сторонних зависимостей изображений, установите их отдельно.
Импорт модулей
Добавьте в скрипт корректные импорты:
import barcode
from barcode.writer import ImageWriterWriters — классы, отвечающие за отрисовку и сохранение изображения штрихкода. ImageWriter сохраняет штрихкоды как растровые изображения (PNG, JPEG и т. п.).
Функция для генерации штрихкода
Пример функции, которая создаёт изображение штрихкода и сохраняет его в файл:
def generate_barcode(data, barcode_format, options=None):
# Получаем класс штрихкода для заданного формата
barcode_class = barcode.get_barcode_class(barcode_format)
# Создаём объект штрихкода с ImageWriter (сохранит как изображение)
barcode_image = barcode_class(data, writer=ImageWriter())
# Сохраняем изображение; расширение зависит от writer (по умолчанию .png)
barcode_image.save("barcode", options=options)Функция сохраняет файл с именем barcode.png (или другим расширением, зависящим от writer).
Пример вызова
generate_barcode("MakeUseOf", "code128")
Настройка внешнего вида
Параметры writer позволяют менять цвет переднего плана, размер модулей, отображение текста и шрифт. Пример с настройками:
generate_barcode("MakeUseOf", "code128", options={"foreground":"red",
"center_text": False,
"module_width":0.4,
"module_height":20})

Совет: если вам нужен векторный формат (SVG), используйте writer, который поддерживает SVG, или сохраните в SVG напрямую (python-barcode поддерживает SVGWriter).
Как сканировать и декодировать штрихкоды
Для сканирования в Python часто используют библиотеку pyzbar (обёртка над zbar) и OpenCV для управления изображениями и видеопотоком.
Установка зависимостей системы и Python
На macOS и Linux требуется библиотека zbar в системе, затем Python‑зависимости:
brew install zbar # Mac OS X
sudo apt-get install libzbar0 # Linux
pip install pyzbar opencv-python(Для Windows используйте инструкции поставщика zbar или установите предварительно собранные бинарники.)
Импорт модулей
import cv2
from pyzbar import pyzbarСканирование штрихкода из изображения
Шаги:
- Загрузить изображение через cv2.imread (получаем numpy.ndarray).
- Передать массив в pyzbar.decode для обнаружения и декодирования.
Пример функции:
def scan_barcode_from_image(image_path):
# Читаем изображение по пути
image = cv2.imread(image_path)
# Декодируем штрихкоды на изображении
barcodes = pyzbar.decode(image)
# Проходим по найденным штрихкодам
for barcode in barcodes:
# Декодируем данные в строку (UTF-8)
barcode_data = barcode.data.decode("utf-8")
barcode_type = barcode.type
print("Barcode Data:", barcode_data)
print("Barcode Type:", barcode_type)Пример вывода:
scan_barcode_from_image("barcode.png")
> Barcode Data: MakeUseOf
> Barcode Type: CODE128Сканирование из потока веб‑камеры
Ниже пример, который захватывает кадры с веб‑камеры и декодирует штрихкоды в реальном времени. Нажмите q, чтобы выйти.
def scan_barcode_from_webcam():
# Инициализируем видеозахват (0 — стандартная веб‑камера)
video_capture = cv2.VideoCapture(0)
while True:
# Получаем кадр из потока
_, frame = video_capture.read()
# Декодируем штрихкоды в кадре
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‑коды — двумерные коды, удобные для хранения URL, контактных данных и небольших текстов. Для генерации QR в Python часто используют библиотеку qrcode:
pip install qrcode[pil]Пример создания QR:
import qrcode
img = qrcode.make('https://example.com')
img.save('qrcode.png')Для сканирования QR можно использовать pyzbar так же, как и для обычных штрихкодов.
Как выбрать формат штрихкода — мини‑методология
- Определите объём данных: если нужно много символов — используйте QR. Для коротких кодов на товарных этикетках подходят EAN/UPC или Code128.
- Требования к совместимости: розничная торговля часто требует EAN‑13/UPC. Логистика — Code128.
- Читаемость и размер: 2D коды лучше читаются при маленьком размере на упаковке.
- Проверка контрольной суммы: многие форматы включают её автоматически (EAN, UPC).
Альтернативные библиотеки и подходы
- treepoem — генерирует штрихкоды через Ghostscript/Barcode Writer (поддерживает много форматов).
- pillow + reportlab — для кастомной отрисовки и векторных отчётов.
- zxing (через вызов внешнего инструмента или обёртки) — альтернатива для декодирования.
Когда python-barcode не подходит: если нужен специфичный векторный вывод или поддержка редких форматов.
Контрольный список по ролям
- Для разработчика:
- Установить зависимости и проверить версии.
- Покрыть генерацию тестами.
- Обработать ошибки ввода (некорректная длина, недопустимые символы).
- Для QA:
- Проверить читаемость на разных принтерах/этикетках.
- Протестировать с физическими сканерами и мобильными приложениями.
- Для DevOps:
- Убедиться, что системные зависимости (zbar, ghostscript) доступны в контейнере.
Критерии приёмки
- Генерация: изображение создаётся корректно, читается pyzbar и другими декодерами.
- Сканирование: при тестовом изображении функция возвращает ожидаемые данные и тип.
- Веб‑камера: приложение стабильно работает ≥5 минут без утечек памяти и корректно завершает работу по ‘q’.
Тест‑кейсы и приёмо‑сдаточные критерии
- Генерация code128 с ASCII‑строкой → файл barcode.png создан, pyzbar возвращает исходную строку.
- Генерация EAN13 с неверной контрольной суммой → библиотека должна выбросить ошибку или отклонить ввод.
- Сканирование с фото → найден хотя бы один корректный код.
- Поток с веб‑камеры → приложение корректно распознаёт штрихкод в кадре и выводит данные.
Глоссарий (1 строка)
- Barcode: машинно читаемое визуальное представление данных.
- QR: двумерный код для хранения больших объёмов данных.
- ImageWriter: класс для сохранения штрихкода как изображения.
Совместимость и советы по миграции
- Если переносите проект в контейнеры, установите системные пакеты zbar в Dockerfile.
- Для Windows используйте предварительно собранные бинарники zbar или замените на облачные API для распознавания.
- Проверяйте кодировки: используйте UTF‑8 при декодировании данных из штрихкода.
Безопасность и приватность
Не храните персональные данные в штрихкодах без шифрования или явного согласия пользователя. Штрихкод легко копируется и сканируется любым устройством.
Резюме
- Python позволяет быстро генерировать и сканировать штрихкоды с помощью python-barcode, pyzbar и OpenCV.
- Выбирайте формат штрихкода исходя из объёма данных и требований совместимости.
- Тестируйте генерацию и сканирование на реальных устройствах и печатных носителях.
Короткая запись для анонса: генерация и чтение штрихкодов в Python — готовые примеры и чек‑листы для запуска в проде.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента