File size: 3,237 Bytes
6084325
8102829
6084325
 
 
5d52af1
9f0ef40
784d954
6084325
 
 
 
 
 
 
 
 
 
 
 
784d954
6084325
 
784d954
9e1cd24
784d954
6084325
784d954
368d01c
24c48fb
 
 
784d954
24c48fb
 
 
 
8102829
 
 
6084325
784d954
9e1cd24
 
 
 
 
 
 
 
 
 
 
9f6b576
9e1cd24
 
 
 
44c3663
9e1cd24
 
 
784d954
6084325
784d954
6084325
784d954
9e1cd24
 
784d954
6084325
 
 
 
784d954
9e1cd24
 
 
 
 
 
 
 
 
 
 
 
 
6084325
9e1cd24
9f6b576
 
 
 
6084325
9e1cd24
056d44f
08657ec
784d954
9e1cd24
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
97
98
99
100
101
102
import qrcode
import cv2
from PIL import Image
import gradio as gr
import tempfile
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
    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 image


# 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."


# Function for generating QR codes with both image and download link
def generate_qr_interface(data):
    qr_file, qr_image = generate_qr(data)
    return qr_image, qr_file  # Return the image and file for download


# Function for reading QR codes with decoded text and clipboard update
def read_qr_interface(img):
    decoded_data = read_qr(img)
    return decoded_data  # Return the decoded text


# Clipboard copy callback
def copy_to_clipboard(decoded_text):
    # Gradio does not support direct clipboard copy; simulate success message
    return f"Copied: {decoded_text}" if decoded_text else "Nothing to copy!"


# Create Gradio Interface
def create_gradio_interface():
    # QR Code Generator Tab
    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 image
            gr.File(label="Download QR Code"),    # Provide a download link
        ],
        title="Generate QR Code",
        description="Quickly create a QR code from any text or URL.",
    )

    # QR Code Reader Tab
    with gr.Blocks() as read_interface:
        gr.Markdown("### Read QR Code")
        with gr.Row():
            qr_input = gr.Image(type="pil", label="Upload QR Code Image")
            qr_text = gr.Textbox(label="Decoded Data", interactive=False)
        copy_button = gr.Button("Copy to Clipboard")
        copy_feedback = gr.Textbox(label="Clipboard Status", interactive=False)

        # Define interactions
        qr_input.change(read_qr_interface, inputs=qr_input, outputs=qr_text)
        copy_button.click(copy_to_clipboard, inputs=qr_text, outputs=copy_feedback)

    # Main interface with tabs
    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"):
            read_interface.render()

    # Launch the interface
    demo.launch(share=True)


# Run the Gradio app
create_gradio_interface()