jitubutwal1441's picture
Added code to generate simple qr, qr with logo and animated qr codes
109506a
raw
history blame
5.54 kB
import io
from urllib.request import urlopen
import qrcode
import segno
import streamlit as st
from PIL import Image
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.colormasks import HorizontalGradiantColorMask
from streamlit_lottie import st_lottie
from utils import hide_footer, lottie_local
def configure_page():
"""
Configures the Streamlit page settings.
"""
st.set_page_config(
page_icon="🤳",
page_title="QR Code Generator",
layout="centered",
initial_sidebar_state="expanded",
menu_items={
"About": "## A minimalistic application to generate QR Codes using Python"
},
)
def display_title_and_animation():
"""
Displays the title and the Lottie animation.
"""
st.title("QR Code Generator")
hide_footer()
anim = lottie_local("assets/animations/scanner.json")
st_lottie(
anim, speed=2, reverse=False, loop=True, quality="medium", height=300, width=300
)
def get_user_input():
"""
Gets the URL input from the user.
"""
return st.text_input(label="Enter the URL to convert into a QR code")
def get_gif_input():
"""
Gets the gif URL input from the user which should be used as a background.
"""
return st.text_input(label="Enter gif URL which should be used in a background")
def get_qr_code_parameters():
"""
Gets the QR code parameters from the user.
"""
col1, col2 = st.columns(2)
with col1:
fill_color = st.color_picker("Pick Fill Color", "#000000")
with col2:
back_color = st.color_picker("Pick Background Color", "#ffffff")
return fill_color, back_color
def generate_animated_qr_code(data, gif_file):
img_path = "animated_qrcode.gif"
slts_qrcode = segno.make_qr(data)
# gif = urlopen(gif_url)
slts_qrcode.to_artistic(
background=gif_file,
target=img_path,
light="white",
scale=10,
)
return img_path
def generate_simple_qr_code(data, fill_color, back_color):
"""
Generates and saves the QR code based on the user input.
"""
qr = qrcode.QRCode(version=4, box_size=10, border=4)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color=fill_color, back_color=back_color)
img_path = "./assets/qrcode.png"
img.save(img_path)
return img_path
def generate_logo_qr_code(data, logo_file_path):
out = io.BytesIO()
# Nothing special here, let Segno generate the QR code and save it as PNG in a buffer
segno.make(data, error="h").save(out, scale=5, kind="png")
out.seek(0) # Important to let Pillow load the PNG
img = Image.open(out)
img = img.convert("RGB") # Ensure colors for the output
img_width, img_height = img.size
logo_max_size = img_height // 3 # May use a fixed value as well
logo_img = Image.open(logo_file_path) # The logo
# Resize the logo to logo_max_size
logo_img.thumbnail((logo_max_size, logo_max_size), Image.Resampling.LANCZOS)
# Calculate the center of the QR code
box = ((img_width - logo_img.size[0]) // 2, (img_height - logo_img.size[1]) // 2)
img.paste(logo_img, box)
img_path = "qrcode_with_logo.png"
img.save(img_path)
return img_path
def display_qr_code(img_path):
"""
Displays the generated QR code and provides a download button.
"""
with open(img_path, "rb") as file:
image = Image.open(file)
st.image(image, caption="QR Code")
def display_download_button(
file_path, filename="your_qr_code.png", mime_type="image/png"
):
with open(file_path, "rb") as file:
st.download_button(
label="Download Image", data=file, file_name=filename, mime=mime_type
)
def main():
"""
Main function for the Streamlit app.
"""
configure_page()
display_title_and_animation()
url = get_user_input()
# gif_url = get_gif_input()
# Dropdown menu
options = ["Simple QR code", "QR code with logo", "Animated QR code"]
selected_option = st.selectbox("Select the type of QR code to generate", options)
is_simple_qr = selected_option == "Simple QR code"
is_logo_qr = selected_option == "QR code with logo"
is_animated_qr = selected_option == "Animated QR code"
if is_simple_qr:
fill_color, back_color = get_qr_code_parameters()
elif is_logo_qr:
logo = st.file_uploader(
label="Upload your logo",
accept_multiple_files=False,
type=["png", "jpg", "jpeg"],
)
elif is_animated_qr:
gif_file = st.file_uploader("Choose a GIF file", type="gif")
# Read the GIF file into memory
if gif_file:
# Display the uploaded GIF
st.image(gif_file, caption="Uploaded GIF", use_column_width=True)
if st.button("Generate") and url:
if is_simple_qr:
img_path = generate_simple_qr_code(url, fill_color, back_color)
image_name = "your_qr_code.png"
mime_type = "image/png"
elif is_logo_qr:
img_path = generate_logo_qr_code(url, logo)
image_name = "your_qr_code.png"
mime_type = "image/png"
elif is_animated_qr:
img_path = generate_animated_qr_code(url, gif_file)
image_name = "your_qr_code.gif"
mime_type = "image/gif"
display_qr_code(img_path)
display_download_button(img_path, image_name, mime_type)
if __name__ == "__main__":
main()