Spaces:
Sleeping
Sleeping
| import os | |
| import streamlit as st | |
| import pathlib | |
| from PIL import Image | |
| import google.generativeai as genai | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| # Configure the API key directly in the script | |
| API_KEY = os.environ.get("GOOGLE_API_KEY") | |
| genai.configure(api_key=API_KEY) | |
| # Generation configuration | |
| generation_config = { | |
| "temperature": 0.8, | |
| "top_p": 0.95, | |
| "top_k": 64, | |
| "max_output_tokens": 50000, | |
| "response_mime_type": "text/plain", | |
| } | |
| # Safety settings | |
| safety_settings = [ | |
| {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, | |
| {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, | |
| {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, | |
| {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, | |
| ] | |
| # Model name | |
| MODEL_NAME = "gemini-1.5-flash-latest" | |
| # Framework selection (e.g., Tailwind, Bootstrap, etc.) | |
| framework = "Regular CSS use flex grid etc" # Change this to "Bootstrap" or any other framework as needed | |
| # Create the model | |
| model = genai.GenerativeModel( | |
| model_name=MODEL_NAME, | |
| safety_settings=safety_settings, | |
| generation_config=generation_config, | |
| ) | |
| # Start a chat session | |
| chat_session = model.start_chat(history=[]) | |
| # Function to send a message to the model | |
| def send_message_to_model(message, image_path): | |
| image_input = { | |
| 'mime_type': 'image/jpeg', | |
| 'data': pathlib.Path(image_path).read_bytes() | |
| } | |
| response = chat_session.send_message([message, image_input]) | |
| return response.text | |
| # Streamlit app | |
| def main(): | |
| st.title("Image to HTML Code AI π¨βπ» ") | |
| st.subheader('Made by [Pushpendra](https://github.com/pushparmar).') | |
| uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) | |
| if uploaded_file is not None: | |
| try: | |
| if uploaded_file.size > 5 * 1024 * 1024: # Limit file size to 5MB | |
| st.error("File size exceeds the limit of 5MB.") | |
| return | |
| if uploaded_file.type not in ["image/jpeg", "image/png"]: | |
| st.error("Invalid file type. Please upload a JPEG or PNG image.") | |
| return | |
| # Load and display the image | |
| image = Image.open(uploaded_file) | |
| st.image(image, caption='Uploaded Image.', use_container_width=True) | |
| # Convert image to RGB mode if it has an alpha channel | |
| if image.mode == 'RGBA': | |
| image = image.convert('RGB') | |
| # Save the uploaded image temporarily | |
| temp_image_path = pathlib.Path("temp_image.jpg") | |
| image.save(temp_image_path, format="JPEG") | |
| styleframework = st.selectbox("Select CSS Framework", ["Regular CSS use flex grid etc", "Bootstrap (Disabled)", "Tailwind (Disabled)"]) | |
| uiFrameWork = st.selectbox("Select UI Framework", ["Regular HTML Code", "React.js (Disabled)", "Angular.js (Disabled)", "Vue.js (Disabled)"]) | |
| # Generate UI description | |
| if st.button("Code UI"): | |
| placeholder = st.empty() | |
| placeholder.write("π§βπ» A parmar code agent is Looking at your UI...") | |
| import time | |
| time.sleep(4) | |
| st.write("π§βπ» A parmar code agent Generating Code for your image") | |
| import time | |
| time.sleep(2) | |
| detailed_prompt = f""" | |
| Analyze the uploaded image and generate a detailed {uiFrameWork} file with inline CSS that accurately represents the UI. | |
| - Identify all UI elements (e.g., buttons, text fields, images, etc.) and their bounding boxes in the format: [object name (y_min, x_min, y_max, x_max)]. | |
| - Describe the color, font, and styling of each element. | |
| - Ensure the {uiFrameWork} code is responsive and mobile-first, using {styleframework} CSS for layout and styling. | |
| - If {uiFrameWork} is selected, generate components with selected framework syntax and include inline CSS for styling. | |
| - Include detailed inline CSS for each element to match the original design as closely as possible. | |
| - Avoid using external libraries or frameworks unless specified. | |
| - Do not include explanations or comments in the code. | |
| - ONLY return the {uiFrameWork} code with inline CSS. | |
| """ | |
| if "Disabled" in uiFrameWork or "Disabled" in styleframework: | |
| st.warning("This option is currently unavailable.") | |
| return | |
| else: | |
| st.write(f"You selected: {uiFrameWork}") | |
| generated_html = send_message_to_model(detailed_prompt, temp_image_path) | |
| # Save the refined HTML to a file | |
| with open("index.html", "w") as file: | |
| file.write(generated_html) | |
| st.success("HTML file 'index.html' has been created.") | |
| # Provide download link for HTML | |
| st.download_button(label="Download HTML", data=generated_html, file_name="index.html", mime="text/html") | |
| # Provide a link to open the HTML file in a new tab | |
| st.markdown(f'<a href="index.html" target="_blank">Open HTML in a new tab</a>', unsafe_allow_html=True) | |
| except Exception as e: | |
| st.error(f"An error occurred: {e}") | |
| if __name__ == "__main__": | |
| main() |