65 lines
1.3 KiB
Python
65 lines
1.3 KiB
Python
import qrcode
|
|
from io import BytesIO
|
|
|
|
|
|
def calculate_qr_settings(text):
|
|
text_length = len(text)
|
|
|
|
if text_length <= 25:
|
|
version = 1
|
|
box_size = 12
|
|
elif text_length <= 47:
|
|
version = 2
|
|
box_size = 10
|
|
elif text_length <= 77:
|
|
version = 3
|
|
box_size = 8
|
|
elif text_length <= 114:
|
|
version = 4
|
|
box_size = 7
|
|
elif text_length <= 154:
|
|
version = 5
|
|
box_size = 6
|
|
elif text_length <= 195:
|
|
version = 6
|
|
box_size = 5
|
|
elif text_length <= 224:
|
|
version = 7
|
|
box_size = 5
|
|
elif text_length <= 279:
|
|
version = 8
|
|
box_size = 4
|
|
elif text_length <= 335:
|
|
version = 9
|
|
box_size = 4
|
|
elif text_length <= 395:
|
|
version = 10
|
|
box_size = 3
|
|
else:
|
|
version = None
|
|
box_size = 3
|
|
|
|
return version, box_size
|
|
|
|
|
|
async def generate_qr(text):
|
|
version, box_size = calculate_qr_settings(text)
|
|
|
|
qr = qrcode.QRCode(
|
|
version=version,
|
|
error_correction=qrcode.constants.ERROR_CORRECT_L,
|
|
box_size=box_size,
|
|
border=4,
|
|
)
|
|
|
|
qr.add_data(text)
|
|
qr.make(fit=True)
|
|
|
|
qr_image = qr.make_image(fill_color="black", back_color="white")
|
|
|
|
img_buffer = BytesIO()
|
|
qr_image.save(img_buffer, format="PNG")
|
|
img_buffer.seek(0)
|
|
|
|
return img_buffer
|