Как поместить полноценное изображение на фон QR кода с помощью Python (быстро, без регистрации и смс).
Суть проблемы
Всем привет, Хабрчане! В наше нелегкое время QR коды требуют на каждом углу, от Кинотеатров до общественных Туалетов. Пандемия увеличила популярность этих удобных квадратов и дала понимание, что без них не обойтись.
К сожалению их удобство не смогло совладать с раздражающим процессом демонстрации сертификата администраторам и охранникам во всех общественных местах.
Лица проверяющих, к которым зачастую выстраиваются очереди, выглядят мягко сказать недовольными. А если этот набор пикселей затерялся в галерее… И так пару раз за день. Вся эта процедура раздражает и бесит!
Поиск решения
Мне надоело показывать унылые QR коды унылым администраторам и охранникам заведений, и решил чуть приободрить это тухлое занятие.
Идея заключалась в генерации забавных QR-кодов. Тут же побежал на просторы интернетов в поисках готовых библиотек и модулей.
Из достойного попался на глаза модуль MyQR (Amazing-QR):
Плюсы: На Python, возможность создания gif изображений
Минусы: Шакальное качество, эстетически несочетающиеся с изображением полосы
Источник - https://github.com/x-hw/amazing-qr
К великому сожалению все они оказались чересчур примитивными, генерирующими пережатый 8/10 шакалов дЖпег со страшными полосами в QR коде, что совсем мне не подходило.
Время костылей
Было решено написать свой костыль модуль-надстройку для qrcode (Python).
Определился с минимальными требованиями для него:
Добротное качество выходного изображения
Отсутствие непонятных позиционных полос
Возможность изменения стиля и цвета пикселей* кода
Весь код есть на Github, ссылка будет внизу, в источниках
И так, начнем…
Первым делом устанавливаем все зависимости командой: pip install -r requirements.txt
В зависимости от вашей ОС устанавливаем модуль pyzbar. Инструкция: https://pypi.org/project/pyzbar/
Если у вас Mac OS и вылезают ошибки zbar, то перед каждым запуском ОС выполняйте команду: export DYLD_LIBRARY_PATH=/opt/homebrew/lib
Все остальное для быстрого использования уже настроено и готово к работе, просто откройте файл example.py
from path import Path
from main import gen_qr_code
text = "текст для шифровки в QR код"
path_to_download = Path().joinpath("example", "example.jpg")
path_to_save = Path().joinpath("example", "example.png")
gen_qr_code(text, path_to_download, path_to_save)
Модуль Path
нужен для работы с путями. Функция gen_qr_code
является генератором QR-кода, для нее подготавливаем:
text - текст, url, то что будет шифроваться в QR код
path_to_download - путь до фоновой картинки (вместе с именем и форматом самой картинки)
path_to_save - путь куда сохранять готовое изображение (в формате .png)
1) Передаем 3 аргумента в gen_qr_code()
2) Запуск из корневой директории команды - python example.py
3) Готово!
Логика работы банальна - Фоновое изображение автоматически подгоняется под будущие размеры QR-кода, затем модуль qrcode генерирует числовую матрицу из текста, который ему передали, после модуль Pillow
рисует png картинку из матрицы, и наконец png накладывается на фоновую картинку.
Спасибо!
Хочу поблагодарить за внимание дорогие мои, добра вам и счастья в копилку. Сделаем этот мир чуточку веселее!
Если кого нибудь заинтересует более подробный функционал (изменение цвета, яркости, формы пикселей qr кода - прошу написать мне, с удовольствием поделюсь)
Источники:
Исходный код на Github: https://github.com/Ruslanch0s/qrgenerator
Рабочий пример функционала (бот в telegram): https://t.me/QrHub_bot
Комментарии (6)
fire_engel
16.02.2022 22:27+6напоминает гайд, как написать клон майнкрафта на питоне.
шаг 1: pip install minecraft
шаг 2: import minecraft
шаг 3: minecraft.run()
но статья полезная
Mozhaiskiy
16.02.2022 23:09+2Я таким образом считерил на 4-м курсе: в курсовой работе нужно было написать довольно длинную программу на LabView, а мне совершенно не хотелось с ней разбираться в той части, что не связана с обработкой сигналов и интерфейсом. Ну я нашел лазейку в техническом задании и написал часть логики на Delphi, упаковал всё в DLL и вызвал эту функцию из LabView. Преподаватель сказал, что я нахал и хитрец, но поставил пятёрку ???? Что характерно, часть группы посчитала меня тогда жмотом и гнидой, поскольку я так и не мог доходчиво объяснить им, что «скопировать и чуть изменить мой вариант» не получится ????
okolosov
17.02.2022 10:05Интересно было бы посмотреть на реакцию пенсионера-охранника в каком-нибудь ТЦ на отшибе на такой QR-код.
Monarch88
17.02.2022 13:23Все зависит от жизненной позиции человека. Сам хожу со сгенеренной qr-анимацией. В районном дворце спорта бабушке-вахтеру понравилось, а вот в районном доме культуры шутку не оценили, заявив: "я не стану ЭТО сканировать" - пришлось более настойчиво попросить отсканировать.
denis-19
Вроде работает :)