44 lines
1.3 KiB
Python
44 lines
1.3 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-код из изображения"""
|
|
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}" |