CultriX's picture
Update app.py
8b06480 verified
raw
history blame
2.59 kB
import gradio as gr
import tempfile
import qrcode
from PIL import Image
import numpy as np
import cv2
def generate_qr(data: str) -> tuple:
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")
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
img.save(temp_file.name, format="PNG")
temp_file.close() # Ensure file is written to disk
return temp_file.name, img # Return the file path and the PIL image
def read_qr(img: Image.Image) -> str:
img = np.array(img)
detector = cv2.QRCodeDetector()
data, _, _ = detector.detectAndDecode(img)
return data if data else "No QR code found."
def create_gradio_interface():
def generate_qr_interface(data: str):
qr_file, qr_image = generate_qr(data)
return qr_image, qr_file # Show image and provide download link
def read_qr_interface(img: Image.Image):
decoded_data = read_qr(img)
return decoded_data # Return decoded text
generate_interface = gr.Interface(
fn=generate_qr_interface,
inputs=gr.Textbox(placeholder="Enter text or URL here...", label="Data to Encode"),
outputs=[
gr.Image(label="Generated QR Code"), # Display the QR code image
gr.File(label="Download QR Code"), # Downloadable link for the QR code file
],
title="Generate QR Code",
description="Quickly create a QR code from any text or URL.",
)
read_interface = gr.Interface(
fn=read_qr_interface,
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.",
)
with gr.Blocks() as demo:
gr.Markdown("## QR Code Tool: Generate and Decode with Ease")
with gr.Tab("Generate QR Code"):
generate_interface.render()
with gr.Tab("Read QR Code"):
with gr.Row():
qr_text = gr.Textbox(label="Decoded Data") # Single box for decoded data
copy_button = gr.Button("Copy to Clipboard")
read_interface.render()
copy_button.click(
lambda text: gr.Textbox.update(value="Copied to Clipboard!"),
qr_text,
qr_text,
)
demo.launch(share=True)
create_gradio_interface()