MpakoPhone/qr_utils.py

53 lines
1.4 KiB
Python

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}"