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()