CultriX's picture
Update app.py
9f0ef40 verified
raw
history blame
3.72 kB
import qrcode
import cv2
from PIL import Image
import gradio as gr
import tempfile
import os
import numpy as np
from fastapi import FastAPI
from fastapi.responses import FileResponse
from fastapi.middleware.cors import CORSMiddleware
# Create a FastAPI app instance for API calls
app = FastAPI()
# Add CORS middleware to allow external API calls
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# 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
# 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."
# API endpoint to download QR code
@app.get("/download_qr")
def download_qr(data: str):
file_path = generate_qr(data)
return FileResponse(file_path, media_type="image/png", filename="qrcode.png")
# Custom CSS styling as HTML for dark mode
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>
"""
# Gradio interface for generating and reading QR codes
def create_gradio_interface():
# QR Code Generator Interface
generate_interface = gr.Interface(
fn=generate_qr,
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,
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
interface = gr.TabbedInterface(
[generate_interface, read_interface],
["Generate QR Code", "Read QR Code"]
)
# Launch interface with custom HTML for CSS styling
with gr.Blocks() as demo:
gr.HTML(custom_css) # Embed the custom CSS
interface.render()
demo.launch(share=True, server_name="0.0.0.0", server_port=7860, app=app)
# Run the Gradio interface
create_gradio_interface()