Spaces:
Running
Running
File size: 3,363 Bytes
6084325 8102829 6084325 5d52af1 9f0ef40 6084325 44c3663 6084325 8102829 368d01c 24c48fb 8102829 6084325 9f6b576 6084325 9f6b576 44c3663 9f6b576 44c3663 9f6b576 6084325 44c3663 6084325 9f6b576 6084325 9f6b576 6084325 44c3663 6084325 44c3663 9f6b576 44c3663 6084325 9f6b576 6084325 9f6b576 6084325 9f6b576 6084325 9f6b576 6084325 056d44f 08657ec 056d44f 0125c43 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
import qrcode
import cv2
from PIL import Image
import gradio as gr
import tempfile
import os
import numpy as np
# Function to generate a QR code
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")
# Save to a temporary file and return the file path
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
img.save(temp_file.name, format="PNG")
temp_file.close() # Close the file to flush contents to disk
return temp_file.name # Return the file path
# Function to read a QR code using OpenCV
def read_qr(img):
# Convert PIL image to a NumPy array
img = np.array(img)
# Convert RGB to BGR format as OpenCV expects BGR
if img.ndim == 3:
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# Initialize OpenCV QR code detector
detector = cv2.QRCodeDetector()
data, _, _ = detector.detectAndDecode(img)
return data if data else "No QR code found."
# Gradio interface with functional buttons
def create_gradio_interface():
# QR Code Generator with Downloadable File
def generate_qr_with_download(data):
qr_file = generate_qr(data) # Generate QR code file
return qr_file # Return file directly as downloadable output
# QR Code Reader with Copy-to-Clipboard functionality
def read_qr_with_copy(img):
decoded_data = read_qr(img) # Decode QR code
return decoded_data, decoded_data # Return decoded text for display and copy
# Generator Interface
generate_interface = gr.Interface(
fn=generate_qr_with_download,
inputs=gr.Textbox(placeholder="Enter text or URL here...", label="Data to Encode"),
outputs=gr.File(label="Download Generated QR Code"), # File download
title="Generate QR Code",
description="Quickly create a QR code from any text or URL.",
)
# Reader Interface
read_interface = gr.Interface(
fn=read_qr_with_copy,
inputs=gr.Image(type="pil", label="Upload QR Code Image"),
outputs=[
gr.Textbox(label="Decoded Data"), # Decoded QR code text
gr.Textbox(visible=False), # Invisible output for clipboard content
],
title="Read QR Code",
description="Upload an image with a QR code to decode the embedded data.",
live=False,
)
# Add clipboard copy functionality using Gradio button callbacks
def on_copy(decoded_text):
return gr.Textbox.update(value=decoded_text) # Update clipboard content
# Custom UI with clipboard copy button
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")
qr_clipboard = gr.Textbox(visible=False) # Clipboard value
copy_button = gr.Button("Copy to Clipboard")
read_interface.render()
copy_button.click(on_copy, qr_text, qr_clipboard)
demo.launch(share=True)
# Run the Gradio interface
create_gradio_interface()
|