File size: 2,869 Bytes
3aa4e37
2cad3b3
8b06480
2cad3b3
3aa4e37
 
327c8c5
352e30c
9f0ef40
3aa4e37
 
2cad3b3
 
 
 
 
 
 
 
 
6084325
327c8c5
3aa4e37
 
327c8c5
 
784d954
352e30c
3aa4e37
 
2cad3b3
3aa4e37
2cad3b3
3aa4e37
 
 
2cad3b3
 
8102829
3aa4e37
8102829
6084325
352e30c
3aa4e37
 
 
 
352e30c
327c8c5
3aa4e37
 
 
 
352e30c
3aa4e37
 
 
9e1cd24
3aa4e37
327c8c5
 
 
 
3aa4e37
6084325
3aa4e37
 
 
 
 
550ae51
327c8c5
7df5306
3aa4e37
 
 
 
 
 
 
327c8c5
 
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
90
91
92
93
94
95
96
import qrcode
import cv2
from PIL import Image
import gradio as gr
import tempfile
import numpy as np
import os


# 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 QR code image to a temporary file
    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
    img.save(temp_file.name, format="PNG")
    temp_file.close()  # Ensure the file is saved
    return temp_file.name  # Return the file path


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

        # Tab for generating QR codes
        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):
                if not data.strip():
                    raise ValueError("Input text cannot be empty!")
                qr_file_path = generate_qr(data)
                qr_image_pil = Image.open(qr_file_path)
                return qr_image_pil, qr_file_path

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

        # Tab for reading QR codes
        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):
                if img is None:
                    raise ValueError("Please upload a valid QR code image!")
                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()