TL;DR Полная записная книжка Python и изображения в моем репозитории GitHub здесь.

Далее в тексте ниже:
1. Создайте простой QR-код без стилей.
2. Данные QR-кода: URL, VCard, iCal
3. Стилизация
— Цвета и размеры
— Стиль модуля
— Стиль глаз
— Добавление логотипов

Создание простого QR-кода:

import qrcode
img = qrcode.make('Some data here')
type(img) 
img.save("qrcode1.png")

визитная карточка

Данные, представленные в QR-коде, обычно представляют собой URL-адрес, но это может быть что угодно, включая VCard, который полезен для обмена контактными данными на мобильных устройствах, и пример этих данных показан ниже. Для получения дополнительной информации о том, как добавить другие поля данных в VCards, ознакомьтесь со статьей о них в Википедии.

import qrcode
img = qrcode.make('''
BEGIN:VCARD
VERSION:3.0
N:Gump;Forrest;;Mr.;
FN:Forrest Gump
ORG:Bubba Gump Shrimp Co.
TEL;TYPE=Work:011 555-1212
TEL;TYPE=mobile:072 434-1202
ADR;TYPE=Work,PREF:;;100 Waters Edge;Baytown;LA;30314;United States of America
LABEL;TYPE=Work,PREF:100 Waters Edge\nBaytown\, LA 30314\nUnited States of America
EMAIL;TYPE=Work:[email protected]
END:VCARD
''')
type(img)
img.save("vcard.png")

iКалендарь

Или создав бронирование iCal для других, чтобы добавить их в свои календари. Для получения дополнительной информации о файлах iCal или .ics посетите этот ресурс.

import qrcode
img = qrcode.make('''
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Lunchtime meeting
DTSTART;TZID=America/New_York:20230420T120000
DURATION:PT1H
LOCATION:Meeting Room 1
END:VEVENT
END:VCALENDAR
''')
type(img)
img.save("vcal.png")

Стайлинг

Существует множество способов стилизации QR-кода, особенно с помощью qrcode python package. Сначала будет объяснен каждый параметр стиля, встроенный в пакет, а затем я объясню некоторые пользовательские функции стиля, которые я добавил.

Включаемые параметры:
Версия,
Исправление ошибок,
Размер окна,
Граница,
Цвет заливки,
Цвет фона,
Ящик модуля ,
Встроенное изображение,
Маска цвета,
Ящики для глаз.

Версия

Размер QR-кода задается параметром версия. Этот параметр устанавливает количество модулей (черных или белых ящиков) на каждой стороне. Самая маленькая версия, версия 1, имеет 21 модуль каждого размера, что означает, что все изображение состоит из модулей 21x21. Размер увеличивается на 4 модуля с каждой стороны для каждой версии до максимальной версии 40 и размером 177x177.

Исправление ошибки

Этот параметр определяет, сколько «мусорных» или нечитаемых модулей разрешено в образе. Краткое описание, основанное на математическом алгоритме исправления ошибок, заключается в том, что чем выше уровень исправления ошибок, тем больший физический ущерб может выдержать QR-код, оставаясь при этом читаемым. Это отлично подходит для кодов, которые будут использоваться на листовках или на открытом воздухе, которые все еще могут быть читаемы даже после небольшого воздействия погодных условий. Для наиболее устойчивого к повреждениям QR-кода установите коррекцию ошибок на H.

Размер коробки

Размер блока определяет физический размер QR-кода, задавая количество пикселей в каждом блоке или модуле.

Граница

Это еще одна простая настройка, которая позволяет вам установить размер рамки вокруг вашего QR-кода. Он измеряется в модулях и помогает добавить дополнительные пробелы для дополнения вашего QR-кода при создании файла .png.

Цвет заливки

Это цвет модулей. Этот параметр может принимать строки цветов, например, «розовый» или «красный», а также кортежи цветов RGB.

Фоновый цвет

Это цвет фона. Этот параметр также может принимать цветовые строки, например «розовый» или «красный», а также цветовые кортежи RGB.

Выдвижной ящик

Можно стилизовать сами модули. Этот параметр позволяет вам сделать это в различных формах, показанных ниже.

Встроенное изображение

Также можно встроить изображение в центр QR-кода, например, логотип. Этот параметр позволяет сделать это с любым файлом .png. Предпочтительно начинать с квадратного изображения, но если вы решите использовать изображение, которое не является квадратным, тогда пакет qrcode сожмет самую длинную сторону изображения, чтобы она соответствовала самой короткой, и сделает его квадратным.

Цветовая маска

Цветовая маска позволяет добавлять в ваш qrcode более сложные цветовые узоры, такие как градиенты или даже изображение. Это окрашивает модули вашего qrcode и оставляет фон.

Ящики для глаз

Последняя часть настройки — это глаза. Три угловых квадрата, которые видны на qr-кодах, выполняют жизненно важную функцию, помогая считывающему устройству понять ориентацию qr-кода. Пакет qrcode имеет встроенную функцию, позволяющую настраивать глаза с помощью различных ящиков модулей. Чтобы настроить их дальше, я добавил свою собственную функцию стиля, которая использует маскирование, чтобы вы могли выбрать не только ящик модуля, который будет использоваться для вашего глаза, но и изменить цвета внутреннего и внешнего глаза.

Код пользовательского стиля можно увидеть ниже.

import PIL
from PIL import Image, ImageDraw

#Custom function for eye styling. These create the eye masks

def style_inner_eyes(img):
  img_size = img.size[0]
  eye_size = 70 #default
  quiet_zone = 40 #default
  mask = Image.new('L', img.size, 0)
  draw = ImageDraw.Draw(mask)
  draw.rectangle((60, 60, 90, 90), fill=255) #top left eye
  draw.rectangle((img_size-90, 60, img_size-60, 90), fill=255) #top right eye
  draw.rectangle((60, img_size-90, 90, img_size-60), fill=255) #bottom left eye
  return mask

def style_outer_eyes(img):
  img_size = img.size[0]
  eye_size = 70 #default
  quiet_zone = 40 #default
  mask = Image.new('L', img.size, 0)
  draw = ImageDraw.Draw(mask)
  draw.rectangle((40, 40, 110, 110), fill=255) #top left eye
  draw.rectangle((img_size-110, 40, img_size-40, 110), fill=255) #top right eye
  draw.rectangle((40, img_size-110, 110, img_size-40), fill=255) #bottom left eye
  draw.rectangle((60, 60, 90, 90), fill=0) #top left eye
  draw.rectangle((img_size-90, 60, img_size-60, 90), fill=0) #top right eye
  draw.rectangle((60, img_size-90, 90, img_size-60), fill=0) #bottom left eye  
  return mask  

# Useage of the custom functions
import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer,VerticalBarsDrawer,SquareModuleDrawer
from  qrcode.image.styles.colormasks import SolidFillColorMask

if not hasattr(PIL.Image, 'Resampling'):
  PIL.Image.Resampling = PIL.Image
# Now PIL.Image.Resampling.BICUBIC is always recognized.


qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)

qr.add_data('http://www.medium.com')

qr_inner_eyes_img = qr.make_image(image_factory=StyledPilImage,
                            eye_drawer=RoundedModuleDrawer(radius_ratio=1.2),
                            color_mask=SolidFillColorMask(back_color=(255, 255, 255), front_color=(63, 42, 86)))

qr_outer_eyes_img = qr.make_image(image_factory=StyledPilImage,
                            eye_drawer=VerticalBarsDrawer(),
                            color_mask=SolidFillColorMask(front_color=(255, 128, 0)))                            

qr_img = qr.make_image(image_factory=StyledPilImage,
                       module_drawer=SquareModuleDrawer())

inner_eye_mask = style_inner_eyes(qr_img)
outer_eye_mask = style_outer_eyes(qr_img)
intermediate_img = Image.composite(qr_inner_eyes_img, qr_img, inner_eye_mask)
final_image = Image.composite(qr_outer_eyes_img, intermediate_img, outer_eye_mask)
final_image.save('final_image.png')

Заключение

Есть много способов стилизовать qrcode и сделать его интересным для вашей целевой аудитории, и Python — отличный язык для этого! Вы можете проверить весь код в моем репозитории GitHub здесь.