|
import streamlit as st |
|
from rembg import remove |
|
from PIL import Image, ImageOps |
|
import numpy as np |
|
|
|
|
|
st.set_page_config(page_title="Background Removal App", layout="wide") |
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
/* Genel stil */ |
|
body { |
|
background-color: black; |
|
color: white; |
|
font-family: 'Arial', sans-serif; |
|
} |
|
|
|
/* Buton stilleri */ |
|
.stDownloadButton button { |
|
background-color: #4F8BF9; |
|
color: white; |
|
border: none; |
|
padding: 12px 24px; |
|
border-radius: 8px; |
|
transition: background-color 0.3s ease; |
|
font-size: 16px; |
|
font-weight: bold; |
|
} |
|
.stDownloadButton button:hover { |
|
background-color: #3B6BB0; |
|
} |
|
|
|
/* Footer stilleri */ |
|
.footer { |
|
text-align: center; |
|
padding: 10px; |
|
background-color: #333; |
|
border-radius: 8px; |
|
margin-top: 20px; |
|
} |
|
|
|
/* Tooltip stilleri */ |
|
.tooltip { |
|
position: relative; |
|
display: inline-block; |
|
} |
|
.tooltip .tooltiptext { |
|
visibility: hidden; |
|
width: 120px; |
|
background-color: #555; |
|
color: #fff; |
|
text-align: center; |
|
border-radius: 6px; |
|
padding: 5px; |
|
position: absolute; |
|
z-index: 1; |
|
bottom: 125%; /* Butonun üstünde */ |
|
left: 50%; |
|
margin-left: -60px; |
|
opacity: 0; |
|
transition: opacity 0.3s; |
|
} |
|
.tooltip:hover .tooltiptext { |
|
visibility: visible; |
|
opacity: 1; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.title("🎨 Modern Background Removal App") |
|
st.write(""" |
|
📸 **Upload an image or use your camera to see the background removed results!** |
|
This app is developed using the `rembg` library. |
|
""") |
|
|
|
|
|
with st.expander("📁 Upload Image or Use Camera", expanded=True): |
|
option = st.radio("Choose Input Method:", ("Upload Image", "Use Camera")) |
|
|
|
if option == "Upload Image": |
|
uploaded_file = st.file_uploader("Select an image...", type=["jpg", "jpeg", "png"]) |
|
else: |
|
uploaded_file = st.camera_input("Take a photo") |
|
|
|
if uploaded_file is not None: |
|
|
|
image = Image.open(uploaded_file) |
|
st.subheader("🖼️ Original Image") |
|
st.image(image, use_container_width=True, caption="Uploaded Image") |
|
|
|
|
|
st.subheader("🛠️ Image Adjustment") |
|
rotate_angle = st.slider("Rotate Image (Degrees)", -180, 180, 0, help="Rotate the image by the specified angle.") |
|
resize_width = st.slider("Resize Width", 100, 1000, image.width, help="Resize the image width while maintaining aspect ratio.") |
|
|
|
|
|
if rotate_angle != 0: |
|
image = image.rotate(rotate_angle, resample=Image.Resampling.BICUBIC) |
|
if resize_width != image.width: |
|
ratio = resize_width / image.width |
|
height = int(image.height * ratio) |
|
image = image.resize((resize_width, height), resample=Image.Resampling.LANCZOS) |
|
|
|
|
|
st.image(image, use_container_width=True, caption="Adjusted Image") |
|
|
|
|
|
with st.spinner("⏳ Removing background... Please wait."): |
|
output_image = remove(image) |
|
|
|
|
|
st.subheader("✅ Background Removed Image") |
|
st.image(output_image, use_container_width=True, caption="Background Removed Image") |
|
|
|
|
|
silhouette = np.array(output_image) |
|
silhouette[silhouette[..., -1] > 0] = [255, 255, 255, 255] |
|
silhouette[silhouette[..., -1] == 0] = [0, 0, 0, 255] |
|
|
|
|
|
st.subheader("⚫ Silhouette") |
|
st.image(silhouette, use_container_width=True, caption="Silhouette Image") |
|
|
|
|
|
st.markdown("### 📥 Download Options") |
|
|
|
|
|
st.download_button( |
|
label="⬇️ Download Background Removed Image", |
|
data=output_image.tobytes(), |
|
file_name="foreground_image.png", |
|
mime="image/png", |
|
key="download_foreground", |
|
help="Download the image with the background removed." |
|
) |
|
|
|
|
|
silhouette_img = Image.fromarray(silhouette) |
|
st.download_button( |
|
label="⬇️ Download Silhouette", |
|
data=silhouette_img.tobytes(), |
|
file_name="silhouette_image.png", |
|
mime="image/png", |
|
key="download_silhouette", |
|
help="Download the silhouette image." |
|
) |
|
|
|
|
|
st.markdown("---") |
|
st.markdown(""" |
|
<div class="footer"> |
|
🚀 **Developed by Metin Haşimi.**<br> |
|
🌟 Connect with me on <a href="https://www.linkedin.com/in/metin-hasimi-33aa82269" target="_blank">LinkedIn</a> or check out my <a href="https://github.com/metinhasimi22" target="_blank">GitHub</a>. |
|
</div> |
|
""", unsafe_allow_html=True) |