Spaces:
Running
Running
| import qrcode | |
| from PIL import Image | |
| import gradio as gr | |
| import io | |
| import base64 | |
| import numpy as np | |
| import cv2 | |
| import tempfile | |
| # Function to generate a QR code and return Base64 and PNG file | |
| def generate_qr(data): | |
| 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="black", back_color="white") | |
| # Encode the image as a base64 string | |
| buffered = io.BytesIO() | |
| img.save(buffered, format="PNG") | |
| img_base64 = base64.b64encode(buffered.getvalue()).decode("utf-8") | |
| # Save the image temporarily as a PNG file | |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png") | |
| img.save(temp_file.name, format="PNG") | |
| temp_file.close() | |
| return f"data:image/png;base64,{img_base64}", temp_file.name, img_base64 | |
| # Function to decode a QR code from an uploaded image | |
| def decode_qr(img): | |
| if img is None: | |
| return "No image uploaded." | |
| # Convert PIL image to a NumPy array | |
| img_array = np.array(img) | |
| # Convert RGB to BGR as OpenCV expects | |
| if img_array.ndim == 3: | |
| img_array = cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR) | |
| # Initialize OpenCV QR code detector | |
| detector = cv2.QRCodeDetector() | |
| data, _, _ = detector.detectAndDecode(img_array) | |
| return data if data else "No QR code found." | |
| # Load and encode the aesthetic image | |
| def load_aesthetic_image(image_path): | |
| with open(image_path, "rb") as image_file: | |
| img_base64 = base64.b64encode(image_file.read()).decode("utf-8") | |
| return f"data:image/png;base64,{img_base64}" | |
| # Gradio Interface | |
| def create_gradio_interface(): | |
| # Path to the aesthetic image (replace with the uploaded file path) | |
| aesthetic_image_base64 = load_aesthetic_image("/mnt/data/space-logo.png") | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## QR Code Generator and Decoder") | |
| # Tab for generating QR codes | |
| with gr.Tab("Generate QR Code"): | |
| with gr.Row(): | |
| data_input = gr.Textbox(placeholder="Enter text or URL to encode", label="Input Data") | |
| generate_button = gr.Button("Generate QR Code") | |
| qr_code_html = gr.HTML(label="Generated QR Code (Base64 Embedded)") | |
| qr_png_file = gr.File(label="Download QR Code (PNG)") | |
| qr_base64_file = gr.File(label="Download Base64 (TXT)") | |
| def generate_qr_interface(data): | |
| if not data.strip(): | |
| raise ValueError("Input text cannot be empty!") | |
| img_base64, png_path, base64_str = generate_qr(data) | |
| # Save Base64 string as a .txt file | |
| base64_txt_path = tempfile.NamedTemporaryFile(delete=False, suffix=".txt") | |
| with open(base64_txt_path.name, "w") as f: | |
| f.write(base64_str) | |
| # Wrap the base64 string in an <img> tag for display | |
| html_content = f'<img src="{img_base64}" alt="QR Code" style="max-width:300px;">' | |
| return html_content, png_path, base64_txt_path.name | |
| generate_button.click( | |
| generate_qr_interface, | |
| inputs=data_input, | |
| outputs=[qr_code_html, qr_png_file, qr_base64_file], | |
| ) | |
| # Tab for decoding QR codes | |
| with gr.Tab("Decode QR Code"): | |
| with gr.Row(): | |
| image_input = gr.Image(type="pil", label="Upload QR Code Image") | |
| decode_button = gr.Button("Decode QR Code") | |
| decoded_text = gr.Textbox(label="Decoded Text", interactive=True) | |
| decode_button.click( | |
| decode_qr, | |
| inputs=image_input, | |
| outputs=decoded_text, | |
| ) | |
| # Add the aesthetic image at the bottom center | |
| gr.HTML( | |
| f""" | |
| <div style="text-align: center; margin-top: 50px;"> | |
| <img src="{aesthetic_image_base64}" alt="Aesthetic Image" style="max-width: 200px; opacity: 0.8;"> | |
| </div> | |
| """ | |
| ) | |
| demo.launch(share=True) | |
| # Run the Gradio interface | |
| create_gradio_interface() | |