QR-scanner / app.py
Ivan000's picture
Update app.py
48c8169 verified
import gradio as gr
import cv2
from pyzbar.pyzbar import decode
from PIL import Image
import numpy as np
import io
import base64
def scan_qr_code(image):
"""
Scan QR code from the uploaded image.
Args:
image: The uploaded image (can be PIL Image, numpy array, or file path)
Returns:
str: The decoded QR code data with a descriptive message.
"""
try:
if image is None:
return "No image provided"
# Convert to PIL Image if needed
if isinstance(image, np.ndarray):
image = Image.fromarray(image)
elif isinstance(image, str):
try:
if image.startswith('data:image'):
# Handle base64 encoded images
image_data = base64.b64decode(image.split(',')[1])
image = Image.open(io.BytesIO(image_data))
else:
# Handle file paths
image = Image.open(image)
except Exception as e:
return f"Error opening image: {str(e)}"
# Convert to OpenCV format
open_cv_image = np.array(image)
if len(open_cv_image.shape) == 3: # Color image
open_cv_image = cv2.cvtColor(open_cv_image, cv2.COLOR_RGB2BGR)
# Decode QR code
decoded_objects = decode(open_cv_image)
if decoded_objects:
for obj in decoded_objects:
decoded_data = obj.data.decode('utf-8')
return f"The code contains the following data: {decoded_data}"
return "No QR code found"
except Exception as e:
return f"Error processing image: {str(e)}"
# Define the Gradio interface
iface = gr.Interface(
fn=scan_qr_code,
inputs=gr.Image(label="Upload QR Code Image"), # Removed type parameter
outputs=gr.Textbox(label="Result"),
title="QR Code Scanner",
description="Upload an image containing a QR code to decode it.",
examples=[], # You can add example images here
cache_examples=False
)
# Launch the Gradio app
if __name__ == "__main__":
iface.launch(share=True) # Added share=True for public access