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