File size: 2,594 Bytes
3aa4e37
2cad3b3
8b06480
2cad3b3
3aa4e37
 
 
352e30c
9f0ef40
3aa4e37
 
2cad3b3
 
 
 
 
 
 
 
 
6084325
3aa4e37
 
 
 
 
784d954
352e30c
3aa4e37
 
2cad3b3
3aa4e37
2cad3b3
3aa4e37
 
 
2cad3b3
 
8102829
3aa4e37
8102829
6084325
352e30c
3aa4e37
 
 
 
352e30c
3aa4e37
 
 
 
352e30c
3aa4e37
 
 
9e1cd24
3aa4e37
 
 
6084325
3aa4e37
 
 
 
 
550ae51
7df5306
3aa4e37
 
 
 
 
 
 
 
 
 
 
 
 
 
550ae51
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
import qrcode
import cv2
from PIL import Image
import gradio as gr
import tempfile
import numpy as np
import shutil  # For cleaning up temporary files


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


# Gradio Interface
def create_gradio_interface():
    with gr.Blocks() as demo:
        gr.Markdown("## QR Code Tool: Generate and Decode with Ease")

        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):
                qr_file_path, qr_image_pil = generate_qr(data)
                return qr_image_pil, qr_file_path

            generate_button.click(
                generate_qr_interface,
                inputs=data_input,
                outputs=[qr_image, qr_file],
            )

        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")

            decoded_data = gr.Textbox(label="Decoded Data")

            def read_qr_interface(img):
                return read_qr(img)

            decode_button.click(
                read_qr_interface,
                inputs=image_input,
                outputs=decoded_data,
            )

    demo.launch(share=True)


# Run the Gradio interface
create_gradio_interface()