File size: 4,042 Bytes
352e30c
 
2cad3b3
352e30c
8b06480
2cad3b3
352e30c
 
 
 
 
 
 
 
9f0ef40
352e30c
 
 
2cad3b3
 
 
 
 
 
 
 
 
6084325
2cad3b3
352e30c
 
2cad3b3
784d954
352e30c
 
 
 
 
 
 
 
 
 
2cad3b3
352e30c
2cad3b3
 
352e30c
 
2cad3b3
 
8102829
352e30c
 
8102829
6084325
352e30c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e1cd24
2cad3b3
352e30c
 
 
2cad3b3
6084325
352e30c
6084325
2cad3b3
6084325
 
 
 
2cad3b3
550ae51
352e30c
86ef4a9
550ae51
 
 
 
 
2cad3b3
6084325
2cad3b3
7df5306
 
 
 
 
 
 
 
550ae51
056d44f
08657ec
352e30c
 
 
 
 
 
 
 
 
 
 
 
 
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
120
121
122
123
124
125
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()