CultriX's picture
Update app.py
7df5306 verified
raw
history blame
4.04 kB
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()
download_button = gr.Button("Download QR Code")
download_button.click(fn=lambda x: download_qr_code(x), inputs="Generated QR Code", outputs=None)
with gr.Tab("Read QR Code"):
read_interface.render()
copy_button = gr.Button("Copy to Clipboard")
copy_button.click(fn=lambda x: copy_to_clipboard(x), inputs="Decoded Data", outputs=None)
demo.launch(share=True)
custom_css = """
<style>
body {background-color: #1e1e2f; font-family: Arial, sans-serif; color: #e0e0e0;}
.gradio-container {max-width: 600px; margin: auto; padding: 20px; background-color: #2c2c3e; border-radius: 10px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);}
h1, h2 {text-align: center; color: #f0f0f0; font-weight: 600;}
.gr-button {background-color: #3a3a4f; color: #e0e0e0; padding: 10px 20px; border-radius: 5px; font-size: 15px; border: none;}
.gr-button:hover {background-color: #505068;}
input, textarea,.gr-box {background-color: #3a3a4f; border: 1px solid #555; border-radius: 5px; padding: 10px; font-size: 14px; color: #e0e0e0;}
.gr-box:hover, input:hover, textarea:hover {border-color: #777;}
</style>
"""
create_gradio_interface()