Spaces:
Running
Running
import os | |
import tempfile | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import gradio as gr | |
import pyperclip | |
def generate_qr_code(data): | |
""" | |
Generate a QR code from the given data. | |
Args: | |
data (str): The data to encode in the QR code. | |
Returns: | |
str: The path to the generated QR code image. | |
""" | |
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") | |
# Save to a temporary file and return the file path | |
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file: | |
img.save(temp_file.name, format="PNG") | |
return temp_file.name | |
def read_qr_code(img): | |
""" | |
Read a QR code from the given image. | |
Args: | |
img (PIL.Image): The image containing the QR code. | |
Returns: | |
str: The decoded data from the QR code. | |
""" | |
# Convert PIL image to a NumPy array | |
img_array = np.array(img) | |
# Convert RGB to BGR format as OpenCV expects BGR | |
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." | |
def download_qr_code(qr_image): | |
""" | |
Download the generated QR code image. | |
Args: | |
qr_image (str): The path to the generated QR code image. | |
""" | |
# Implement download logic here | |
pass | |
def copy_to_clipboard(decoded_text): | |
""" | |
Copy the decoded text to the clipboard. | |
Args: | |
decoded_text (str): The decoded text to copy. | |
""" | |
pyperclip.copy(decoded_text) | |
def create_gradio_interface(): | |
""" | |
Create the Gradio interface for generating and reading QR codes. | |
""" | |
# QR Code Generator Interface | |
generate_interface = gr.Interface( | |
fn=generate_qr_code, | |
inputs=gr.Textbox(placeholder="Enter text or URL here...", label="Data to Encode"), | |
outputs=gr.Image(label="Generated QR Code"), | |
title="Generate QR Code", | |
description="Quickly create a QR code from any text or URL.", | |
) | |
# QR Code Reader Interface | |
read_interface = gr.Interface( | |
fn=read_qr_code, | |
inputs=gr.Image(type="pil", label="Upload QR Code Image"), | |
outputs=gr.Textbox(label="Decoded Data"), | |
title="Read QR Code", | |
description="Upload an image with a QR code to decode the embedded data.", | |
) | |
# Combine interfaces into a single tabbed layout | |
with gr.Blocks() as demo: | |
gr.HTML(custom_css) # Embed the custom CSS | |
with gr.Tab("Generate QR Code"): | |
generate_interface.render() | |
qr_code_output = generate_interface.outputs[0] | |
download_button = gr.Button("Download QR Code") | |
download_button.click(fn=download_qr_code, inputs=[qr_code_output], outputs=None) | |
with gr.Tab("Read QR Code"): | |
read_interface.render() | |
decoded_data_output = read_interface.outputs[0] | |
copy_button = gr.Button("Copy to Clipboard") | |
copy_button.click(fn=copy_to_clipboard, inputs=[decoded_data_output], outputs=None) | |
demo.launch(share=True) | |