File size: 2,594 Bytes
6084325
 
81c5eba
8b06480
 
 
9f0ef40
81c5eba
6084325
 
 
 
 
 
 
 
 
 
 
 
784d954
86ef4a9
784d954
81c5eba
86ef4a9
8102829
86ef4a9
8102829
6084325
550ae51
81c5eba
 
 
44c3663
81c5eba
86ef4a9
550ae51
9e1cd24
6084325
784d954
6084325
81c5eba
 
 
 
6084325
 
 
 
550ae51
 
86ef4a9
550ae51
 
 
 
 
6084325
550ae51
9f6b576
 
 
81c5eba
 
 
 
9310f69
81c5eba
 
9310f69
 
550ae51
056d44f
08657ec
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
import gradio as gr
import tempfile
import qrcode
from PIL import Image
import numpy as np
import cv2

def generate_qr(data: str) -> tuple:
    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")

    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

def read_qr(img: Image.Image) -> str:
    img = np.array(img)
    detector = cv2.QRCodeDetector()
    data, _, _ = detector.detectAndDecode(img)
    return data if data else "No QR code found."

def create_gradio_interface():
    def generate_qr_interface(data: str):
        qr_file, qr_image = generate_qr(data)
        return qr_image, qr_file  # Show image and provide download link

    def read_qr_interface(img: Image.Image):
        decoded_data = read_qr(img)
        return decoded_data  # Return decoded text

    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 QR code image
            gr.File(label="Download QR Code"),    # Downloadable link for the QR code file
        ],
        title="Generate QR Code",
        description="Quickly create a QR code from any text or URL.",
    )

    read_interface = gr.Interface(
        fn=read_qr_interface,
        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.",
    )

    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"):
            with gr.Row():
                qr_text = gr.Textbox(label="Decoded Data")  # Single box for decoded data
                copy_button = gr.Button("Copy to Clipboard")
            read_interface.render()
            copy_button.click(
                lambda text: gr.Textbox.update(value="Copied to Clipboard!"),
                qr_text,
                qr_text,
            )

    demo.launch(share=True)

create_gradio_interface()