Генерация QR-кодов на Python: практическое руководство
Хотите научиться создавать QR-коды с помощью Python? В этом руководстве вы узнаете how to create qr code in python с использованием популярных библиотек, разберём технические тонкости и скрытые нюансы, о которых умалчивают в базовых туториалах.
Выбор инструмента: какая библиотека вам действительно подойдёт
Python предлагает несколько библиотек для генерации QR-кодов. Каждая имеет свои особенности, которые критично влияют на результат.
# Базовый пример с qrcode
import qrcode
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data('https://example.com')
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save("example_qr.png")
Скрытые нюансы генерации QR-кодов
Большинство руководств умалчивает о критически важных параметрах, которые влияют на сканируемость и долговечность кода.
Коррекция ошибок — не просто настройка, а стратегический выбор. Уровень L (Low) экономит место, но делает код уязвимым к повреждениям. Уровень H (High) увеличивает размер, но позволяет восстановить до 30% данных.
Размер модуля (box_size) определяет физический размер QR-кода при печати. Меньше 3 пикселей — рискуете получить нечитаемый код на термоэтикетках. Больше 15 — потеряете детализацию на маленьких носителях.
Сравнение библиотек для генерации QR-кодов
| Критерий | qrcode | segno | pyqrcode |
|---|---|---|---|
| Поддержка SVG | ❌ | ✅ | ✅ |
| Микро QR-коды | ❌ | ✅ | ❌ |
| Производительность | Высокая | Средняя | Низкая |
| Настройка цветов | Базовая | Расширенная | Базовая |
| Русская документация | Частично | ❌ | ❌ |
Оптимизация для реальных задач
Создание QR-кода — только половина дела. В production-среде важно учитывать:
Объём данных напрямую влияет на версию QR-кода. Версия 1 (21×21 модуль) вмещает до 25 байт, версия 40 (177×177) — до 2953 байт. Превышение лимита — частая причина некорректной генерации.
Кодирование символов: кириллица требует вдвое больше места чем латиница. Всегда указывайте кодировку явно:
# Для русского текста
qr.add_data('Привет мир'.encode('utf-8'))
Автоматизация пакетной генерации
Для массового создания кодов используйте асинхронную генерацию:
import asyncio
import aiofiles
import qrcode
async def generate_qr_async(data, filename):
qr = qrcode.QRCode()
qr.add_data(data)
img = qr.make_image()
async with aiofiles.open(filename, 'wb') as f:
img.save(f)
Интеграция с веб-приложениями
Создавайте QR-коды в реальном времени с помощью Flask:
from flask import Flask, send_file
import io
import qrcode
app = Flask(__name__)
@app.route('/qr/<data>')
def generate_qr(data):
img = qrcode.make(data)
buf = io.BytesIO()
img.save(buf)
buf.seek(0)
return send_file(buf, mimetype='image/png')
Вопросы и ответы
Какой максимальный объем данных можно поместить в QR-код?
До 2953 байт для цифровых данных или 1817 кириллических символов в кодировке UTF-8.
Почему мой QR-код не сканируется на некоторых устройствах?
Чаще всего проблема в недостаточном контрасте или слишком маленьком размере модуля. Используйте проверенные цветовые пары: чёрный/белый, тёмно-синий/светло-жёлтый.
Как создать QR-код с логотипом?
Добавление логотипа требует сохранения зоны тишины (quiet zone) вокруг кода. Используйте библиотеку Pillow для совмещения изображений:
from PIL import Image
logo = Image.open('logo.png')
qr = qrcode.make('data')
qr.paste(logo, (qr.size[0]//4, qr.size[1]//4))
Поддерживаются ли русские буквы?
Да, но обязательно явное указание кодировки UTF-8 при добавлении данных.
Можно ли генерировать QR-коды без сохранения на диск?
Да, используйте BytesIO для работы в памяти:
import io
buf = io.BytesIO()
img.save(buf)
Как выбрать правильный уровень коррекции ошибок?
Для печати на неровных поверхностях используйте LEVEL_H, для цифровых носителей — LEVEL_M.
Вывод
Освоив технику how to create qr code in python, вы получаете мощный инструмент для автоматизации задач — от генерации кодов для мероприятий до интеграции в производственные процессы. Ключ к успеху — внимание к деталям: коррекции ошибок, объёму данных и особенностям конечного носителя.
Хорошее напоминание про служба поддержки и справочный центр. Формат чек-листа помогает быстро проверить ключевые пункты.