72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import base64
|
||
|
|
import io
|
||
|
|
import logging
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
QR_DEFAULT_BOX_SIZE = 10
|
||
|
|
QR_DEFAULT_BORDER = 4
|
||
|
|
QR_DEFAULT_FILL_COLOR = (0, 0, 0)
|
||
|
|
QR_DEFAULT_BACK_COLOR = (255, 255, 255)
|
||
|
|
|
||
|
|
|
||
|
|
def generate_qr_image(
|
||
|
|
data: str,
|
||
|
|
box_size: int = QR_DEFAULT_BOX_SIZE,
|
||
|
|
border: int = QR_DEFAULT_BORDER,
|
||
|
|
fill_color: str | tuple[int, int, int] = QR_DEFAULT_FILL_COLOR,
|
||
|
|
back_color: str | tuple[int, int, int] = QR_DEFAULT_BACK_COLOR,
|
||
|
|
):
|
||
|
|
import qrcode
|
||
|
|
from qrcode.image.styledpil import StyledPilImage
|
||
|
|
from qrcode.image.styles.colormasks import SolidFillColorMask
|
||
|
|
from qrcode.image.styles.moduledrawers import SquareModuleDrawer
|
||
|
|
|
||
|
|
qr = qrcode.QRCode(
|
||
|
|
version=None,
|
||
|
|
error_correction=qrcode.constants.ERROR_CORRECT_M,
|
||
|
|
box_size=box_size,
|
||
|
|
border=border,
|
||
|
|
)
|
||
|
|
qr.add_data(data)
|
||
|
|
qr.make(fit=True)
|
||
|
|
|
||
|
|
return qr.make_image(
|
||
|
|
image_factory=StyledPilImage,
|
||
|
|
module_drawer=SquareModuleDrawer(),
|
||
|
|
color_mask=SolidFillColorMask(
|
||
|
|
front_color=fill_color,
|
||
|
|
back_color=back_color,
|
||
|
|
),
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def generate_qr_base64(
|
||
|
|
data: str,
|
||
|
|
box_size: int = QR_DEFAULT_BOX_SIZE,
|
||
|
|
border: int = QR_DEFAULT_BORDER,
|
||
|
|
fill_color: str = QR_DEFAULT_FILL_COLOR,
|
||
|
|
back_color: str = QR_DEFAULT_BACK_COLOR,
|
||
|
|
) -> str:
|
||
|
|
image = generate_qr_image(data, box_size, border, fill_color, back_color)
|
||
|
|
|
||
|
|
buf = io.BytesIO()
|
||
|
|
image.save(buf, format="PNG")
|
||
|
|
return base64.b64encode(buf.getvalue()).decode("utf-8")
|
||
|
|
|
||
|
|
|
||
|
|
def generate_qr_bytes(
|
||
|
|
data: str,
|
||
|
|
box_size: int = QR_DEFAULT_BOX_SIZE,
|
||
|
|
border: int = QR_DEFAULT_BORDER,
|
||
|
|
fill_color: str = QR_DEFAULT_FILL_COLOR,
|
||
|
|
back_color: str = QR_DEFAULT_BACK_COLOR,
|
||
|
|
) -> bytes:
|
||
|
|
image = generate_qr_image(data, box_size, border, fill_color, back_color)
|
||
|
|
|
||
|
|
buf = io.BytesIO()
|
||
|
|
image.save(buf, format="PNG")
|
||
|
|
return buf.getvalue()
|