Гид по технологиям

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

4 min read Python Обновлено 24 Dec 2025
Генерация и чтение штрихкодов в Python
Генерация и чтение штрихкодов в 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")

Сгенерированное изображение штрихкода формата 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 — альтернативные движки для распознавания (есть порты и биндинги).

Мини‑методология внедрения в проект

  1. Прототип: сгенерируйте штрихкод и считайте его локально.
  2. Автоматизация: интегрируйте генерацию в CI/скрипты сборки этикеток.
  3. Тестирование: проверьте печать и считывание на реальном оборудовании.
  4. Мониторинг: логируйте неуспешные сканирования и повторные попытки.

Роль‑ориентированные чек‑листы

  • Для разработчика:
    • Установить зависимости и проверить примеры.
    • Добавить обработку ошибок при чтении/сохранении.
  • Для тестировщика:
    • Проверить штрихкоды на различных принтерах и камерах.
    • Проверить поведение при повреждении этикетки.
  • Для 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, тестирование на камере/принтере.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Автозаполнение паролей на iPhone и iPad
Пароли

Автозаполнение паролей на iPhone и iPad

Отключить звуки корзины и скриншота на Mac
macOS

Отключить звуки корзины и скриншота на Mac

Instagram Topics для Reels — как добавить и использовать
Социальные сети

Instagram Topics для Reels — как добавить и использовать

Контейнеризация Node.js и PostgreSQL с Docker
DevOps

Контейнеризация Node.js и PostgreSQL с Docker

Как защитить Android‑телефон — быстрый чеклист
Мобильная безопасность

Как защитить Android‑телефон — быстрый чеклист

Как заглушить звонки конкретного человека на iPhone
iPhone

Как заглушить звонки конкретного человека на iPhone