-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQR code generator.py
128 lines (106 loc) Β· 4 KB
/
QR code generator.py
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
126
127
128
import streamlit as st
import qrcode
from PIL import Image
import io
def generate_qr_code(url, logo_path=None, fill_color="black", back_color="white",
qr_version=1, error_correction="L", logo_size=50, border=4):
"""
Generate QR code with optional logo
"""
# Map error correction levels
error_correction_mapping = {
"L": qrcode.constants.ERROR_CORRECT_L,
"M": qrcode.constants.ERROR_CORRECT_M,
"Q": qrcode.constants.ERROR_CORRECT_Q,
"H": qrcode.constants.ERROR_CORRECT_H
}
qr = qrcode.QRCode(
version=qr_version,
error_correction=error_correction_mapping[error_correction],
box_size=10,
border=border,
)
qr.add_data(url)
qr.make(fit=True)
qr_img = qr.make_image(fill_color=fill_color, back_color=back_color).convert('RGB')
if logo_path:
logo_img = Image.open(logo_path)
logo_img = logo_img.resize((logo_size, logo_size))
# Calculate position to center the logo
pos = (
(qr_img.size[0] - logo_img.size[0]) // 2,
(qr_img.size[1] - logo_img.size[1]) // 2
)
# Paste logo while maintaining transparency
if logo_img.mode == 'RGBA':
mask = logo_img.split()[3]
qr_img.paste(logo_img, pos, mask)
else:
qr_img.paste(logo_img, pos)
return qr_img
def main():
st.set_page_config(
page_title="QR Code Generator",
page_icon="π",
layout="centered",
)
# Custom CSS styling
st.markdown("""
<style>
.header {
font-size: 36px !important;
color: #1f77b4;
text-align: center;
}
.stDownloadButton button {
width: 100%;
}
</style>
""", unsafe_allow_html=True)
# Main content
st.markdown('<p class="header">Custom QR Code Generator</p>', unsafe_allow_html=True)
with st.form("qr_form"):
url = st.text_input("Enter URL:", placeholder="https://example.com")
col1, col2 = st.columns(2)
with col1:
fill_color = st.color_picker("Foreground Color", "#000000")
with col2:
back_color = st.color_picker("Background Color", "#FFFFFF")
col3, col4 = st.columns(2)
with col3:
qr_version = st.number_input("QR Version (1-40)", 1, 40, 1)
with col4:
error_correction = st.selectbox("Error Correction", ["L", "M", "Q", "H"], index=0)
logo_file = st.file_uploader("Upload Logo (optional)", type=["png", "jpg", "jpeg"])
logo_size = st.slider("Logo Size", 30, 150, 50)
border = st.slider("Border Size", 1, 10, 4)
submitted = st.form_submit_button("Generate QR Code")
if submitted and url:
try:
qr_img = generate_qr_code(
url=url,
logo_path=logo_file,
fill_color=fill_color,
back_color=back_color,
qr_version=qr_version,
error_correction=error_correction,
logo_size=logo_size,
border=border
)
# Display QR code
st.image(qr_img, caption="Generated QR Code", use_column_width=True)
# Download button
img_bytes = io.BytesIO()
qr_img.save(img_bytes, format="PNG")
st.download_button(
label="Download QR Code",
data=img_bytes.getvalue(),
file_name="custom_qr.png",
mime="image/png",
)
except Exception as e:
st.error(f"Error generating QR code: {str(e)}")
elif submitted and not url:
st.warning("Please enter a URL before generating the QR code")
if __name__ == "__main__":
main()