import cv2 import numpy as np import base64 from io import BytesIO from PIL import Image import qrcode def decode_qr_from_image(image_data: bytes) -> str | None: """Распознаёт QR-код из изображения""" try: nparr = np.frombuffer(image_data, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) detector = cv2.QRCodeDetector() data, bbox, _ = detector.detectAndDecode(img) if data: return data.strip() except Exception as e: print(f"QR decode error: {e}") return None def generate_qr_image(data: str) -> bytes: """Генерирует QR-код и возвращает байты изображения""" qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(data) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") buffered = BytesIO() img.save(buffered, format="PNG") return buffered.getvalue() def generate_qr_base64(data: str) -> str: """Генерирует QR и возвращает base64 строку для веб-морды""" img_bytes = generate_qr_image(data) img_base64 = base64.b64encode(img_bytes).decode() return f"data:image/png;base64,{img_base64}"