Spaces:
Build error
Build error
| 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() | |