|
|
|
import os |
|
import zipfile |
|
import streamlit as st |
|
from PIL import Image, ImageOps |
|
import io |
|
import tempfile |
|
|
|
|
|
patterns = { |
|
1: "Barcode Pattern.jpg", |
|
2: "Diagonal Stripes.jpg", |
|
3: "horizontal stripe pattern.jpg", |
|
4: "Vertical Concentrated.jpg" |
|
} |
|
|
|
|
|
def apply_pattern(image, pattern_id): |
|
"""Apply selected stripe pattern to the given image.""" |
|
original = image.convert("RGBA") |
|
pattern = Image.open(patterns[pattern_id]).convert("L") |
|
|
|
|
|
transparent_pattern = Image.new("RGBA", pattern.size) |
|
for x in range(pattern.width): |
|
for y in range(pattern.height): |
|
pixel = pattern.getpixel((x, y)) |
|
|
|
transparent_pattern.putpixel((x, y), (0, 0, 0, 255) if pixel < 128 else (0, 0, 0, 0)) |
|
|
|
|
|
transparent_pattern = ImageOps.fit(transparent_pattern, original.size, method=0, bleed=0.0, centering=(0.5, 0.5)) |
|
|
|
|
|
combined = Image.alpha_composite(original, transparent_pattern) |
|
return combined |
|
|
|
|
|
def process_image(image, pattern_id, image_name): |
|
"""Apply the selected pattern to the uploaded image and save it to the output directory.""" |
|
combined_image = apply_pattern(image, pattern_id) |
|
|
|
|
|
combined_image = combined_image.convert("RGB") |
|
|
|
|
|
img_byte_arr = io.BytesIO() |
|
combined_image.save(img_byte_arr, format='JPEG') |
|
img_byte_arr.seek(0) |
|
return img_byte_arr |
|
|
|
|
|
def create_zip_file(image_buffers, zip_filename): |
|
"""Create a ZIP file from the processed images.""" |
|
with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: |
|
for idx, image_buffer in enumerate(image_buffers): |
|
|
|
zipf.writestr(f"patterned_image_{idx + 1}.jpg", image_buffer.read()) |
|
return zip_filename |
|
|
|
|
|
st.title("Stripe Pattern Applier") |
|
st.write("Upload one or multiple images and apply a stripe pattern.") |
|
|
|
|
|
upload_option = st.radio("Choose Upload Option", ["Upload Single Image", "Upload Multiple Images"]) |
|
|
|
|
|
if upload_option == "Upload Single Image": |
|
uploaded_files = st.file_uploader("Choose an image file", type=["png", "jpg", "jpeg", "bmp", "gif"], key="single_image") |
|
else: |
|
uploaded_files = st.file_uploader("Choose image files", type=["png", "jpg", "jpeg", "bmp", "gif"], accept_multiple_files=True, key="multiple_images") |
|
|
|
|
|
pattern_option = st.radio( |
|
"Select Pattern Option", |
|
options=["Apply One Pattern", "Apply All Patterns"] |
|
) |
|
|
|
|
|
if pattern_option == "Apply One Pattern": |
|
pattern_id = st.radio( |
|
"Select a stripe pattern", |
|
options=[1, 2, 3, 4], |
|
format_func=lambda x: { |
|
1: "Vertical Stripes", |
|
2: "Diagonal Stripes", |
|
3: "Horizontal Stripes", |
|
4: "Vertical Concentrated Stripes" |
|
}[x] |
|
) |
|
|
|
|
|
if uploaded_files: |
|
if upload_option == "Upload Single Image": |
|
|
|
image = Image.open(uploaded_files) |
|
st.image(image, caption="Uploaded Image", use_column_width=True) |
|
|
|
|
|
if pattern_option == "Apply One Pattern": |
|
processed_image_buffer = process_image(image, pattern_id, uploaded_files.name) |
|
|
|
st.download_button( |
|
label="Download Processed Image", |
|
data=processed_image_buffer, |
|
file_name=f"patterned_{uploaded_files.name}", |
|
mime="image/jpeg" |
|
) |
|
else: |
|
|
|
processed_image_buffers = [] |
|
for pattern_id in patterns: |
|
processed_image_buffer = process_image(image, pattern_id, uploaded_files.name) |
|
processed_image_buffers.append(processed_image_buffer) |
|
|
|
|
|
zip_filename = "processed_images.zip" |
|
zip_file = create_zip_file(processed_image_buffers, zip_filename) |
|
|
|
|
|
with open(zip_filename, "rb") as f: |
|
st.download_button( |
|
label="Download All Processed Images as ZIP", |
|
data=f, |
|
file_name="processed_images.zip", |
|
mime="application/zip" |
|
) |
|
|
|
else: |
|
|
|
processed_image_buffers = [] |
|
|
|
|
|
for uploaded_file in uploaded_files: |
|
image = Image.open(uploaded_file) |
|
if pattern_option == "Apply One Pattern": |
|
processed_image_buffer = process_image(image, pattern_id, uploaded_file.name) |
|
processed_image_buffers.append(processed_image_buffer) |
|
else: |
|
|
|
for pattern_id in patterns: |
|
processed_image_buffer = process_image(image, pattern_id, uploaded_file.name) |
|
processed_image_buffers.append(processed_image_buffer) |
|
|
|
|
|
zip_filename = "processed_images.zip" |
|
zip_file = create_zip_file(processed_image_buffers, zip_filename) |
|
|
|
|
|
with open(zip_filename, "rb") as f: |
|
st.download_button( |
|
label="Download All Processed Images as ZIP", |
|
data=f, |
|
file_name="processed_images.zip", |
|
mime="application/zip" |
|
) |
|
|
|
else: |
|
st.write("Please upload one or more images to start.") |
|
|