File size: 2,886 Bytes
7324c34
 
fb19d78
7324c34
 
 
 
 
 
 
 
fb19d78
7324c34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb19d78
67d17e1
0b5781e
67d17e1
 
 
 
 
7324c34
67d17e1
ae4b6be
67d17e1
ae4b6be
 
67d17e1
 
7324c34
 
67d17e1
7324c34
2cca2fe
c185f62
 
 
2cca2fe
 
0b5781e
 
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
import qrcode
import gradio as gr


def generate_qr_code(url, color, use_gradient, gradient_color1, gradient_color2, border_radius, logo):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4
    )

    qr.add_data(url)
    qr.make(fit=True)

    qr_img = qr.make_image(fill_color=color)

    if use_gradient:
        qr_img = qr_img.convert("RGB")
        qr_pixels = qr_img.load()
        width, height = qr_img.size

        for y in range(height):
            for x in range(width):
                pixel = qr_pixels[x, y]
                gradient_ratio = x / width
                new_r = int((gradient_color2[0] - gradient_color1[0]) * gradient_ratio + gradient_color1[0])
                new_g = int((gradient_color2[1] - gradient_color1[1]) * gradient_ratio + gradient_color1[1])
                new_b = int((gradient_color2[2] - gradient_color1[2]) * gradient_ratio + gradient_color1[2])
                qr_pixels[x, y] = (new_r, new_g, new_b)

    if border_radius > 0:
        qr_img = qr_img.resize((qr_img.size[0] + (border_radius * 2), qr_img.size[1] + (border_radius * 2)))
        qr_img = qr_img.convert("RGBA")
        border_img = qrcode.image.svg.SvgPathImage(qr_img.size)
        border_img.path = border_img.rounded_rect((0, 0, *qr_img.size), border_radius)
        border_img.fill = qr_img
        qr_img = border_img

    if logo:
        qr_with_logo = qr_img.copy()
        logo_img = qrcode.image.open(logo)
        logo_width, logo_height = logo_img.size
        pos = ((qr_img.size[0] - logo_width) // 2, (qr_img.size[1] - logo_height) // 2)
        qr_with_logo.paste(logo_img, pos)
        qr_img = qr_with_logo

    return qr_img


def generate_qr_code_app(url: str, color: str, use_gradient: bool, gradient_color1: str, gradient_color2: str,
                         border_radius: int, logo: gr.inputs.Image):
    qr_code = generate_qr_code(url, color, use_gradient, gradient_color1, gradient_color2, border_radius,
                               logo.item.filename if logo is not None else None)
    return qr_code


inputs = [
    gr.inputs.Textbox(label="URL"),
    gr.ColorPicker(label="Color"),
    gr.inputs.Checkbox(label="Use Gradient"),
    gr.ColorPicker(label="Gradient Color 1"),
    gr.ColorPicker(label="Gradient Color 2"),
    gr.inputs.Number(label="Border Radius", default=0, min_value=0),
    gr.inputs.Image(label="Logo (optional)")
]

output = gr.outputs.Image(label="QR Code")

examples = [
    ["https://instagram.com", "#E1306C", False, "#E1306C", "#4458A7", 0, None],
    ["https://twitter.com", "#1DA1F2", False, "#1DA1F2", "#124964", 5, None],
    ["https://huggingface.co", "#EE5A55", False, "#EE5A55", "#FBB040", 10, None]
]

iface = gr.Interface(fn=generate_qr_code_app, inputs=inputs, outputs=output, examples=examples)
iface.launch()