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-код из изображения Возвращает декодированную строку или None """ try: # Конвертируем байты в numpy массив nparr = np.frombuffer(image_data, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) # Инициализируем детектор QR-кодов 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_code(data: str, size: int = 300) -> str: """ Генерирует QR-код из строки и возвращает base64 строку """ 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") # Конвертируем в base64 buffered = BytesIO() img.save(buffered, format="PNG") img_base64 = base64.b64encode(buffered.getvalue()).decode() return f"data:image/png;base64,{img_base64}"