Полное руководство для начинающих: генерация QR-кодов на Python
В этой статье мы разберём, как использовать QR-коды на Python и рассмотрим множество практических сценариев их применения. Вы узнаете, как создать QR-код и как декодировать его с помощью Python.
Итак, давайте разберём это шаг за шагом.
Введение в QR-коды на Python
QR-коды прочно вошли в нашу повседневную жизнь и используются в самых разных областях: маркетинге, управлении складскими запасами, бесконтактных платежах. Это разновидность штрихкода, который можно быстро отсканировать камерой смартфона, чтобы получить доступ к информации или перейти на веб-сайт.
Python — популярный язык программирования для решения самых разных задач, включая генерацию и чтение QR-кодов. Для Python доступно несколько библиотек, которые заметно упрощают работу с QR-кодами. Эти библиотеки предоставляют простой и гибко настраиваемый способ создавать и сканировать QR-коды на Python.
Одно из главных преимуществ использования Python для генерации и чтения QR-кодов — простота и удобство. Python — высокоуровневый язык, который легко изучить, а его синтаксис интуитивно понятен и хорошо читается. Кроме того, в Python есть множество библиотек и инструментов, которые облегчают работу с QR-кодами.
В следующих разделах мы разберём, как генерировать и читать QR-коды с помощью Python, включая необходимые библиотеки и инструменты, лучшие практики, полезные советы и практические примеры. Независимо от того, разработчик вы или просто интересуетесь темой QR-кодов, эта статья даст вам знания и инструменты, необходимые для начала работы с QR-кодами на Python.
Что такое QR-код?
QR-код — это двумерный штрихкод, который хранит информацию в машиночитаемом формате. Он был впервые изобретён в Японии в 1990-х годах для отслеживания автомобильных деталей, но с тех пор получил широкое распространение в самых разных сферах. Смартфоны, планшеты и другие устройства с камерой и приложением для чтения QR-кодов способны их распознавать. QR-коды могут хранить разные типы данных: текст, URL-адреса, контактную информацию или сведения о товаре. Их можно печатать на самых разных поверхностях — билбордах, постерах, визитках, упаковке товаров, — что делает их эффективным способом делиться информацией и взаимодействовать с клиентами.
Установка необходимых библиотек для работы с QR-кодами в Python
Прежде чем генерировать или читать QR-коды на Python, нужно установить необходимые библиотеки. К счастью, для Python доступно несколько библиотек, которые значительно упрощают работу с QR-кодами.
Две самые популярные библиотеки для генерации QR-кодов на Python — это qrcode и PyQRCode. Библиотека qrcode проста и удобна в использовании, позволяет создавать QR-коды с гибкой настройкой параметров. Библиотека PyQRCode написана на чистом Python и может генерировать QR-коды без внешних зависимостей.
Для установки этих библиотек можно использовать pip — стандартный менеджер пакетов Python. Сначала откройте терминал или командную строку и введите следующую команду, чтобы установить библиотеку qrcode:
1
pip install qrcode
Далее, чтобы установить библиотеку PyQRCode, введите следующую команду:
1
pip install pyqrcode
Библиотека ZBar — популярный выбор для чтения QR-кодов на Python. ZBar — это open-source набор инструментов для чтения штрихкодов из различных источников, включая файлы изображений и видеопотоки. Чтобы установить библиотеку ZBar, введите следующую команду:
1
pip install pyzbar
После установки библиотек можно приступать к генерации и чтению QR-кодов на Python. В следующем разделе мы рассмотрим, как генерировать QR-коды с помощью библиотек qrcode и PyQRCode.
Как создать генератор QR-кодов на Python?
Давайте напишем программу на Python, которая будет генерировать QR-код.
Генерация QR-кодов на Python — простой процесс, требующий всего нескольких строк кода. В этом разделе мы рассмотрим, как генерировать QR-коды с помощью библиотек qrcode и PyQRCode.
Генерация QR-кодов с помощью qrcode
Библиотека qrcode проста и удобна в использовании, позволяет создавать QR-коды с гибкой настройкой параметров. Вот пример того, как сгенерировать простой QR-код с помощью qrcode:
1
2
3
4
5
6
7
8
9
10
import qrcode
\# Generate QR code
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data("Hello, World!")
qr.make(fit=True)
\# Save QR code as the image file
img = qr.make_image(fill_color="black", back_color="white")
img.save("hello_world_qrcode.png")
В коде выше мы сначала импортируем библиотеку qrcode. Затем создаём объект QR-кода и задаём версию, размер блока и ширину рамки. После этого добавляем данные, которые хотим закодировать, в объект QR-кода и вызываем метод make(), чтобы сгенерировать QR-код. В конце сохраняем QR-код как файл изображения.
Генерация QR-кодов с помощью PyQRCode
Библиотека PyQRCode написана на чистом Python и может генерировать QR-коды без внешних зависимостей. Вот пример того, как сгенерировать простой QR-код с помощью PyQRCode:
1
2
3
4
5
6
7
import pyqrcode
\# Generate QR code
qr = pyqrcode.create("Hello, World!")
\# Save the QR code as an image file
qr.png("hello_world_qrcode.png", scale=6)
В коде выше мы сначала импортируем библиотеку PyQRCode. Затем создаём объект QR-кода и указываем данные, которые хотим закодировать. После этого вызываем метод png(), чтобы сгенерировать QR-код и сохранить его как файл изображения.
Библиотеки qrcode и PyQRCode предоставляют дополнительные возможности для настройки внешнего вида и поведения QR-кода — например, задание уровня коррекции ошибок или добавление логотипа на QR-код. Подробнее об этих опциях можно узнать в документации к каждой библиотеке.
Генерация QR-кода без внешних библиотек
В стандартной библиотеке Python нет поддержки QR-кодов, поэтому создать QR-код совсем без каких-либо библиотек не получится — разве что реализовать спецификацию ISO/IEC 18004 самостоятельно, включая коррекцию ошибок Рида — Соломона, маскирование и всё остальное. Обычно под «без внешних библиотек» подразумевают без скомпилированных или системных зависимостей, и вот это вполне достижимо:
- PyQRCode (вместе с
pypngдля вывода в PNG) написана на чистом Python без C-расширений, поэтомуpip install pyqrcode pypngработает везде, где есть Python. Пример с PyQRCode приведён выше. - qrcode требует Pillow только для вывода изображений; метод
qrcode.make(data).get_matrix()илиqrcode.QRCode.print_ascii()даёт вам код без зависимости от Pillow:
1
2
3
4
5
6
import qrcode
qr = qrcode.QRCode()
qr.add_data("https://khushaljethava.work")
qr.print_ascii() # renders in the terminal, no Pillow needed
matrix = qr.get_matrix() # list of lists of booleans, render however you like
Если ваше ограничение — «никакого pip install», честный ответ такой: обратитесь к системной утилите или воспользуйтесь готовым API для генерации QR-кодов — писать кодировщик вручную это проект на несколько дней, а не короткий сниппет.
Пример генератора QR-кода на Python с добавлением логотипа
Чтобы более наглядно показать, как генерировать QR-коды на Python, рассмотрим пример с использованием библиотеки qrcode.
Допустим, мы генерируем QR-код для URL-адреса сайта и хотим добавить логотип в центр QR-кода. Вот пример того, как сгенерировать QR-код с такими параметрами:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import qrcode
\# Generate QR code with logo
qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4)
qr.add_data("https://www.example.com/")
qr.make(fit=True)
\# Add logo to QR code
icon = qrcode.util.Octagon()
icon.add_data("Logo")
icon.make(fit=True)
qr_icon = qr.make_image(fill_color="black", back_color="white").copy()
qr_icon.paste(icon.make_image(fill_color="black", back_color="white").resize((40, 40)), (80, 80))
\# Save the QR code as the image file
qr_icon.save("website_qrcode.png")
В коде выше мы сначала импортируем библиотеку qrcode. Затем создаём объект QR-кода и задаём версию, уровень коррекции ошибок, размер блока и ширину рамки. После этого добавляем URL-адрес сайта, который хотим закодировать, в объект QR-кода и вызываем метод make(), чтобы сгенерировать QR-код.
Чтобы добавить логотип на QR-код, создаём отдельный объект QR-кода для логотипа и добавляем данные, которые хотим закодировать (в данном случае текст “Logo”). Затем создаём QR-код логотипа и изменяем его размер, чтобы он поместился в центре основного QR-кода, с помощью метода paste().
В конце сохраняем QR-код как файл изображения. При выполнении этого кода будет создан QR-код с указанным URL-адресом сайта и логотипом в центре.
В следующем разделе мы рассмотрим, как читать QR-коды с помощью Python.
Как сканировать QR-код с помощью Python? (Считыватель и декодер QR-кодов)
Чтение QR-кодов на Python столь же простое, как и их создание. Декодер QR-кодов на Python принимает изображение или кадр видео и возвращает закодированные в нём данные — ту же самую работу выполняет камера телефона, только без самой камеры. В этом разделе мы рассмотрим, как читать QR-коды с помощью библиотек pyzbar и zbarlight.
Чтение QR-кодов с помощью pyzbar
Библиотека pyzbar — это обёртка над библиотекой zbar, которая умеет читать различные штрихкоды, включая QR-коды. Вот пример того, как прочитать QR-код с помощью pyzbar:
1
2
3
4
5
6
7
8
9
10
11
import cv2
from pyzbar.pyzbar import decode
\# Load image
img = cv2.imread("qr_code.png")
\# Decode QR code
data = decode(img)\[0\].data.decode("utf-8")
\# Print decoded data
print(data)
В коде выше мы сначала импортируем cv2 и функцию decode из библиотеки pyzbar.pyzbar. Затем загружаем изображение с QR-кодом с помощью функции imread() из cv2.
Мы передаём изображение в функцию decode(), чтобы декодировать QR-код, которая возвращает список объектов Barcode. Поскольку на изображении только один QR-код, мы обращаемся к первому элементу списка и декодируем его данные с помощью метода decode(). Также указываем формат кодировки (в данном случае utf-8).
В конце выводим декодированные данные в консоль. При выполнении этого кода будут напечатаны данные, закодированные в QR-коде.
Чтение QR-кодов с помощью zbarlight
Библиотека zbarlight простая и лёгкая, позволяет читать QR-коды без внешних зависимостей. Вот пример того, как прочитать QR-код с помощью zbarlight:
1
2
3
4
5
6
7
8
9
10
11
import zbarlight
\# Load image
with open("qr_code.png", "rb") as image_file:
image = image_file.read()
\# Decode QR code
data = zbarlight.scan_codes("qrcode", image)\[0\].decode("utf-8")
\# Print decoded data
print(data)
В коде выше мы сначала импортируем библиотеку zbarlight. Затем загружаем изображение с QR-кодом с помощью функции open() в режиме rb (чтение в бинарном формате).
Чтобы декодировать QR-код, передаём данные изображения в функцию scan_codes() вместе с типом кода, который хотим отсканировать (в данном случае qrcode). Обращаемся к первому элементу списка, возвращённого функцией, и декодируем его данные с помощью метода decode(). Также указываем формат кодировки (в данном случае utf-8).
В конце выводим декодированные данные в консоль. При выполнении этого кода будут напечатаны данные, закодированные в QR-коде.
В следующем разделе мы рассмотрим, как объединить генерацию и чтение QR-кодов с графическим интерфейсом на Python Tkinter.
Создание генератора QR-кодов на Python и Tkinter
С помощью Python и Tkinter можно легко создать собственный генератор QR-кодов для ввода данных и создания кастомных QR-кодов. В этом руководстве мы пройдём все шаги по созданию генератора QR-кодов на Python и Tkinter.
Сначала установим необходимые библиотеки для создания генератора QR-кодов с графическим интерфейсом.
1
pip install tk pillow
Теперь, когда нужные библиотеки установлены, можно приступать к созданию пользовательского интерфейса нашего генератора QR-кодов с помощью Tkinter.
Сначала нужно импортировать необходимые библиотеки:
1
2
3
import tkinter as tk
import qrcode
from PIL import Image, ImageTk
Далее нужно создать главное окно приложения:
1
2
root = tk.Tk()
root.title("QR Code Generator")
Также можно задать размер и положение окна:
1
2
3
4
5
6
7
8
9
width = 400
height = 500
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width / 2\) \- (width / 2\)
y = (screen_height / 2\) \- (height / 2\)
root.geometry("%dx%d+%d+%d" % (width, height, x, y))
Далее создадим подписи и поля ввода, чтобы пользователь мог ввести свои данные:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
label = tk.Label(root, text="Enter data to encode:")
label.pack(pady=10)
data_entry = tk.Entry(root, width=30)
data_entry.pack(pady=10)
label2 = tk.Label(root, text="Select the size of the QR code:")
label2.pack(pady=10)
size_var = tk.StringVar()
size_var.set("7")
size_options = \["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"\]
size_dropdown = tk.OptionMenu(root, size_var, \*size_options)
size_dropdown.pack(pady=10)
Также можно добавить кнопку, при нажатии на которую пользователь будет генерировать QR-код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def generate_qr():
data = data_entry.get()
size = int(size_var.get())
qr = qrcode.QRCode(
version=1,
box_size=size,
border=5
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill="black", back_color="white")
img.save("qrcode.png")
image = Image.open("qrcode.png")
image = image.resize((250, 250), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
qr_label.config(image=photo)
qr_label.image = photo
button = tk.Button(root, text="Generate QR Code", command=generate_qr)
button.pack(pady=10)
Наконец, создадим подпись для отображения сгенерированного QR-кода:
1
2
3
qr_label = tk.Label(root)
qr_label.pack(pady=10)
root.mainloop()
Так мы создаём простой пользовательский интерфейс для нашего генератора QR-кодов, который позволяет пользователям вводить данные, выбирать размер кода и генерировать QR-код. Сгенерированный код отображается в окне приложения.
После нажатия кнопки изображение будет сохранено в той же папке.
Итак, у нас уже есть программа с графическим интерфейсом, которая генерирует QR-код, а теперь мы напишем программу, которая будет сканировать QR-код с помощью Python.
Создание сканера QR-кодов на Python и Tkinter
В этом разделе мы рассмотрим сканирование и декодирование QR-кодов с помощью Python и библиотеки Tkinter. Наша программа на Python позволит извлекать данные из QR-кодов, такие как URL-адреса или контактная информация. Начнём!
Прежде чем создавать наш сканер QR-кодов, нужно установить несколько необходимых библиотек. Мы будем использовать библиотеки pyzbar и Pillow для декодирования QR-кодов и обработки изображений. Установить эти библиотеки можно с помощью pip. Откройте терминал или командную строку и введите следующие команды:
1
2
pip install pyzbar
pip install Pillow
После установки необходимых библиотек можно создать пользовательский интерфейс с помощью Tkinter. Нам понадобится подпись для отображения изображения QR-кода и кнопка для запуска сканирования. Вот код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk, Image
import pyzbar.pyzbar as pyzbar
class QRScanner:
def __init__(self, master):
self.master = master
master.title("QR Code Scanner")
self.label = tk.Label(master)
self.label.pack()
self.button = tk.Button(master, text="Scan", command=self.scan)
self.button.pack()
def scan(self):
filename = filedialog.askopenfilename()
img = Image.open(filename)
decoded_objects = pyzbar.decode(img)
for obj in decoded_objects:
print("Type:", obj.type)
print("Data:", obj.data.decode("utf-8"))
img = ImageTk.PhotoImage(img)
self.label.configure(image=img)
self.label.image = img
root = tk.Tk()
width = 400
height = 500
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width / 2\) \- (width / 2\)
y = (screen_height / 2\) \- (height / 2\)
root.geometry("%dx%d+%d+%d" % (width, height, x, y))
scanner = QRScanner(root)
root.mainloop()
Сначала в коде выше мы импортируем необходимые библиотеки и определяем класс QRScanner. Мы создаём окно с помощью Tkinter и добавляем подпись и кнопку. При нажатии на кнопку вызывается метод scan(). Этот метод открывает диалоговое окно выбора файла, позволяя пользователю выбрать изображение с QR-кодом. После выбора изображения мы используем библиотеку pyzbar, чтобы декодировать данные QR-кода. Затем выводим в консоль тип данных и декодированные данные. Наконец, отображаем изображение QR-кода в подписи с помощью библиотеки Pillow.
Теперь, когда код нашего сканера QR-кодов написан, давайте его протестируем. Сохраните приведённый выше код в файл Python, например qrscanner.py. Откройте терминал или командную строку и перейдите в папку, где сохранён файл. Затем введите следующую команду, чтобы запустить программу:
| python qrscanner.py | | :—- |
Программа должна открыть окно с кнопкой “Scan”. Нажмите на кнопку и выберите изображение с QR-кодом. Декодированные данные будут выведены в консоль.
Лучшие практики работы с QR-кодами
Хотя генерация и чтение QR-кодов на Python — довольно простая задача, важно следовать некоторым лучшим практикам, чтобы получить наилучший результат. Вот несколько советов, о которых стоит помнить при работе с QR-кодами на Python:
- Выбирайте надёжную библиотеку для работы с QR-кодами: несмотря на то, что для генерации и чтения QR-кодов на Python доступно множество библиотек, важно выбрать надёжную, которая активно поддерживается и имеет хорошую документацию.
- Используйте качественные изображения: при генерации QR-кодов используйте изображения высокого качества, чтобы обеспечить их сканируемость. Аналогично, при чтении QR-кодов убедитесь, что изображение чёткое и в фокусе, чтобы избежать ошибок.
- Тестируйте на разных устройствах: тестируйте QR-коды на разных устройствах (например, смартфонах или планшетах), чтобы убедиться в совместимости и читаемости. Разные устройства могут иметь разное разрешение камеры и версии программного обеспечения, что может повлиять на процесс сканирования QR-кода.
- Не усложняйте: при генерации QR-кодов старайтесь, чтобы данные были максимально простыми — это обеспечит хорошую сканируемость кода. Избегайте добавления лишних элементов, например логотипов или изображений, которые могут мешать считыванию QR-кода.
- Проверяйте данные: проверяйте данные перед генерацией QR-кода, чтобы убедиться в их точности. Это поможет избежать ошибок и обеспечит сканируемость QR-кода.
Следуя этим лучшим практикам, вы сможете быть уверены, что ваши QR-коды хорошо сканируются и легко читаются, что особенно важно в маркетинге или в организации мероприятий.
В следующем разделе мы рассмотрим несколько практических применений QR-кодов на Python.
Заключение
QR-коды — универсальный и мощный инструмент, который Python позволяет быстро генерировать и читать. Такие лучшие практики, как использование надёжных библиотек, тестирование на разных устройствах и упрощение данных, помогут сделать ваши QR-коды более эффективными. Кроме того, такие приёмы, как использование динамических кодов и добавление призыва к действию, могут улучшить пользовательский опыт.
При этом важно помнить об ограничениях QR-кодов, таких как необходимость устройства с камерой и ограниченная ёмкость данных. Учитывая эти ограничения, вы сможете создавать QR-коды, которые одновременно хорошо сканируются и приносят реальную пользу. QR-коды способны упростить процессы и улучшить пользовательский опыт, что делает их ценным инструментом для любого проекта.
Часто задаваемые вопросы
Вопрос: Что такое QR-код и как использовать Python для их генерации и чтения? Ответ: QR-код — это двумерный штрихкод, который может хранить самые разные типы данных, включая URL-адреса, контактную информацию и многое другое. С помощью Python можно быстро генерировать и читать QR-коды, используя такие библиотеки, как qrcode и pyzbar.
Вопрос: Как использовать Tkinter для создания пользовательского интерфейса генератора QR-кодов на Python? Ответ: Tkinter — популярная библиотека Python для создания графических пользовательских интерфейсов (GUI). С помощью Tkinter можно создать простой и удобный интерфейс для генератора QR-кодов, который позволит пользователям вводить данные и создавать коды всего в несколько кликов.
Вопрос: Можно ли сканировать и декодировать QR-коды с помощью Python? Ответ: Да, доступно несколько библиотек Python, которые позволяют сканировать и декодировать QR-коды с изображений или видеопотоков. Pyzbar — популярная библиотека для декодирования QR-кодов, а OpenCV можно использовать для декодирования в реальном времени по видео.
Вопрос: Что делает параметр version в библиотеке qrcode на Python, и как fit=True влияет на его поведение? Ответ: version — это размер символа QR-кода, целое число от 1 (сетка 21×21 модуль) до 40 (сетка 177×177 модулей). С каждым шагом вверх добавляется по 4 модуля с каждой стороны и увеличивается объём данных, который можно закодировать. Когда вы вызываете qr.make(fit=True), библиотека игнорирует слишком маленькое значение version и увеличивает его до минимального размера, который действительно вмещает ваши данные, то есть fit=True задаёт нижнюю границу, а не фиксированный размер. При fit=False используется именно та версия, которую вы задали, и при кодировании возникает ошибка DataOverflowError, если данные не помещаются. Указание version=None вместе с fit=True позволяет библиотеке самой выбрать подходящий размер — это самый безопасный вариант по умолчанию для данных, введённых пользователем.
Вопрос: Какую библиотеку использовать в качестве считывателя или декодера QR-кодов на Python? Ответ: pyzbar — это обычный выбор для декодирования QR-кодов из файлов изображений, а zbarlight служит альтернативой — обе рассмотрены в разделе о сканировании выше. Если вы хотите избежать системной зависимости от ZBar, у OpenCV есть собственный декодер: data, points, _ = cv2.QRCodeDetector().detectAndDecode(image) сразу возвращает декодированную строку и работает в том числе с кадрами с веб-камеры.
Вопрос: Есть ли лучшие практики, которым стоит следовать при работе с QR-кодами на Python? Ответ: Да, при работе с QR-кодами на Python стоит придерживаться нескольких лучших практик: использовать надёжные библиотеки, тестировать на разных устройствах и не усложнять данные. Кроме того, использование динамических кодов, добавление призыва к действию и анализ данных помогут сделать ваши QR-коды более эффективными.
Вопрос: Какие есть ограничения у QR-кодов и как их учитывать при создании кодов на Python? Ответ: К некоторым ограничениям QR-кодов относится необходимость смартфона или другого устройства с камерой, а также ограниченная ёмкость данных самих кодов. Учитывая эти ограничения и по возможности их компенсируя — например, используя код меньшего размера и предлагая альтернативные варианты для тех, у кого нет подходящего устройства, — вы сможете создавать практичные и доступные QR-коды на Python.
