Spaces:
Running
Running
File size: 3,769 Bytes
3aa4e37 2cad3b3 8b06480 2cad3b3 3aa4e37 327c8c5 352e30c 9f0ef40 3aa4e37 2cad3b3 6084325 327c8c5 3aa4e37 327c8c5 784d954 352e30c 3aa4e37 2cad3b3 3aa4e37 2cad3b3 3aa4e37 2cad3b3 8102829 3aa4e37 8102829 6084325 352e30c 3aa4e37 352e30c 327c8c5 3aa4e37 352e30c 3aa4e37 9e1cd24 3aa4e37 327c8c5 3aa4e37 6084325 3aa4e37 550ae51 327c8c5 7df5306 3aa4e37 dc4d0ea 3aa4e37 327c8c5 3aa4e37 550ae51 dc4d0ea 056d44f 3aa4e37 |
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
import qrcode
import cv2
from PIL import Image
import gradio as gr
import tempfile
import numpy as np
import os
# 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 QR code image to a temporary file
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
img.save(temp_file.name, format="PNG")
temp_file.close() # Ensure the file is saved
return temp_file.name # Return the file path
# Function to read a QR code
def read_qr(img):
# Convert PIL image to a NumPy array
img = np.array(img)
# Convert RGB to BGR as OpenCV expects
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
def create_gradio_interface():
with gr.Blocks() as demo:
gr.Markdown("## QR Code Tool: Generate and Decode with Ease")
# Tab for generating QR codes
with gr.Tab("Generate QR Code"):
with gr.Row():
data_input = gr.Textbox(placeholder="Enter text or URL here...", label="Data to Encode")
generate_button = gr.Button("Generate QR Code")
with gr.Row():
qr_image = gr.Image(label="Generated QR Code")
qr_file = gr.File(label="Download QR Code")
def generate_qr_interface(data):
if not data.strip():
raise ValueError("Input text cannot be empty!")
qr_file_path = generate_qr(data)
qr_image_pil = Image.open(qr_file_path)
return qr_image_pil, qr_file_path
generate_button.click(
generate_qr_interface,
inputs=data_input,
outputs=[qr_image, qr_file],
)
# Tab for reading QR codes
with gr.Tab("Read QR Code"):
with gr.Row():
image_input = gr.Image(type="pil", label="Upload QR Code Image")
decode_button = gr.Button("Decode QR Code")
with gr.Row():
decoded_data = gr.Textbox(label="Decoded Data", interactive=True)
copy_button = gr.Button("Copy to Clipboard")
def read_qr_interface(img):
if img is None:
raise ValueError("Please upload a valid QR code image!")
return read_qr(img)
decode_button.click(
read_qr_interface,
inputs=image_input,
outputs=decoded_data,
)
# JavaScript for clipboard functionality
copy_button.click(
None,
inputs=[],
outputs=[],
_js="""
() => {
const decodedText = document.querySelector('textarea[placeholder="Decoded Data"]');
if (decodedText) {
navigator.clipboard.writeText(decodedText.value).then(() => {
alert('Copied to Clipboard!');
}).catch(err => {
console.error('Failed to copy: ', err);
});
} else {
alert('No text to copy!');
}
}
"""
)
demo.launch(share=True)
# Run the Gradio interface
create_gradio_interface()
|