app to create interior decor and furnishing by adding furniture to a empty room image
To upload files, please first save the app
import streamlit as st
from PIL import Image
import io
import os
st.title("Interior Room Decorator")
# Create a directory to store uploaded images if it doesn't exist
if not os.path.exists("uploaded_images"):
os.makedirs("uploaded_images")
# Initialize session state for storing the current room and furniture
if "room_image" not in st.session_state:
st.session_state.room_image = None
if "furniture_pieces" not in st.session_state:
st.session_state.furniture_pieces = []
if "composite_image" not in st.session_state:
st.session_state.composite_image = None
# Upload room image
room_image = st.file_uploader("Upload an empty room image", type=["jpg", "jpeg", "png"])
if room_image:
st.session_state.room_image = Image.open(room_image)
st.session_state.composite_image = st.session_state.room_image.copy()
# Sidebar for furniture selection and upload
with st.sidebar:
st.header("Furniture Library")
furniture_image = st.file_uploader("Upload furniture image (with transparent background)", type=["png"])
if furniture_image:
furniture = Image.open(furniture_image)
if furniture.mode != 'RGBA':
st.warning("Please upload an image with transparent background (PNG format)")
else:
# Size control for furniture
size_percent = st.slider("Resize furniture (%)", 10, 200, 100)
# Get original dimensions
orig_width, orig_height = furniture.size
# Calculate new dimensions
new_width = int(orig_width * size_percent / 100)
new_height = int(orig_height * size_percent / 100)
# Resize furniture
furniture = furniture.resize((new_width, new_height))
if st.button("Add Furniture"):
st.session_state.furniture_pieces.append({
'image': furniture,
'position': [0, 0] # Default position
})
# Main area for room display and furniture placement
if st.session_state.room_image is not None:
col1, col2 = st.columns([3, 1])
with col1:
st.image(st.session_state.composite_image, caption="Room Preview", use_column_width=True)
with col2:
st.subheader("Furniture Position")
# Control furniture positions
for idx, furniture in enumerate(st.session_state.furniture_pieces):
st.write(f"Furniture Piece {idx + 1}")
# Get room dimensions for maximum values
room_width, room_height = st.session_state.room_image.size
furniture_width, furniture_height = furniture['image'].size
# Position controls
col_x, col_y = st.columns(2)
with col_x:
furniture['position'][0] = st.number_input(
f"X position {idx}",
0,
room_width - furniture_width,
furniture['position'][0],
key=f"x_{idx}"
)
with col_y:
furniture['position'][1] = st.number_input(
f"Y position {idx}",
0,
room_height - furniture_height,
furniture['position'][1],
key=f"y_{idx}"
)
if st.button(f"Remove Piece {idx + 1}"):
st.session_state.furniture_pieces.pop(idx)
st.rerun()
# Update composite image
composite = st.session_state.room_image.copy()
for furniture in st.session_state.furniture_pieces:
if furniture['image'].mode == 'RGBA':
# Paste furniture onto room image
composite.paste(
furniture['image'],
tuple(furniture['position']),
furniture['image']
)
st.session_state.composite_image = composite
# Download button for final design
if len(st.session_state.furniture_pieces) > 0:
buf = io.BytesIO()
st.session_state.composite_image.save(buf, format='PNG')
buf.seek(0)
st.download_button(
label="Download Design",
data=buf,
file_name="room_design.png",
mime="image/png"
)
else:
st.info("Please upload a room image to start decorating")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?