Mikiko Bazeley commited on
Commit
c6c35c1
·
1 Parent(s): 158efc9

Added more options for postcard customization

Browse files
Files changed (1) hide show
  1. pages/1_Generate_Holiday_Postcard.py +61 -10
pages/1_Generate_Holiday_Postcard.py CHANGED
@@ -5,6 +5,8 @@ from PIL import Image, ImageDraw, ImageFont
5
  from io import BytesIO
6
  import streamlit as st
7
  import textwrap
 
 
8
 
9
  # Set page configuration
10
  st.set_page_config(page_title="FLUX Image Generation Tool", page_icon="🎇")
@@ -55,6 +57,29 @@ holiday_prompts = [
55
  "A lively Independence Day celebration with colorful fireworks lighting up the night sky, flags waving in the breeze, and a peaceful lakeside reflecting the celebration"
56
  ]
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
 
60
  # Function to make requests to the FLUX models
@@ -90,13 +115,23 @@ def wrap_text(text, max_chars):
90
  return "\n".join(textwrap.fill(line, width=max_chars) for line in text.split("\n"))
91
 
92
  # Function to add the holiday message to the image
93
- def add_custom_message(image, message, font_path, font_size, position_vertical, position_horizontal, max_chars, bg_color, font_color):
 
 
 
94
  try:
95
  font = ImageFont.truetype(font_path, font_size)
96
  except IOError:
97
  font = ImageFont.load_default()
98
 
99
- draw = ImageDraw.Draw(image)
 
 
 
 
 
 
 
100
 
101
  # Wrap the text based on the max_chars input
102
  message = wrap_text(message, max_chars)
@@ -105,7 +140,7 @@ def add_custom_message(image, message, font_path, font_size, position_vertical,
105
 
106
  # Calculate the text bounding box dynamically
107
  text_lines = message.split("\n")
108
- line_height = draw.textbbox((0, 0), "A", font=font)[3] # Get height of one line of text (bbox returns top, left, bottom, right)
109
  total_text_height = line_height * len(text_lines)
110
  text_width = max([draw.textbbox((0, 0), line, font=font)[2] for line in text_lines])
111
 
@@ -128,14 +163,23 @@ def add_custom_message(image, message, font_path, font_size, position_vertical,
128
  # Define the padding for the background box behind the text
129
  padding = 10
130
 
131
- # Draw the background rectangle (the text box) with user-specified background color
132
- draw.rectangle([x_pos - padding, y_pos - padding, x_pos + text_width + padding, y_pos + total_text_height + padding], fill=bg_color)
 
 
 
133
 
134
  # Draw the text line by line with the user-specified font color
135
  for i, line in enumerate(text_lines):
136
  draw.text((x_pos, y_pos + i * line_height), line, font=font, fill=font_color)
137
 
138
- return image
 
 
 
 
 
 
139
 
140
  # Streamlit UI
141
  st.title("FLUX Image Generation")
@@ -147,10 +191,13 @@ custom_prompt = st.text_input("Enter your custom prompt") if selected_prompt ==
147
  prompt = custom_prompt if selected_prompt == "Custom" else selected_prompt
148
 
149
  # Dropdown to select the model
150
- model_choice = st.selectbox("Select the model:", ["flux-1-dev", "flux-1-schnell"])
 
 
 
 
151
 
152
  # Additional inputs for customizing the message
153
- message = st.text_input("Enter a holiday message to add:")
154
  font_choice = st.selectbox("Select a font:", list(fonts.keys()))
155
  font_size = st.slider("Select font size:", 10, 100, 40)
156
  max_chars = st.slider("Max characters per line:", 10, 100, 40) # Slider to select character wrap limit
@@ -159,10 +206,14 @@ max_chars = st.slider("Max characters per line:", 10, 100, 40) # Slider to sele
159
  bg_color = st.color_picker("Pick a background color for the text box:", "#FFFFFF")
160
  font_color = st.color_picker("Pick a font color:", "#000000")
161
 
 
 
 
162
  # Position options for the message (vertical and horizontal)
163
  position_vertical = st.radio("Select message vertical position:", ["Top", "Center", "Bottom"])
164
  position_horizontal = st.radio("Select message horizontal position:", ["Left", "Center", "Right"])
165
 
 
166
  # Button to generate images
167
  if st.button("Generate Image"):
168
  if not prompt.strip():
@@ -182,14 +233,14 @@ if st.button("Generate Image"):
182
  # Add the holiday message to the generated image
183
  image_with_message = add_custom_message(
184
  generated_image.copy(), message, font_path, font_size,
185
- position_vertical, position_horizontal, max_chars, bg_color, font_color
186
  )
187
 
188
  # Display the image with the message
189
  st.image(image_with_message, caption=f"Generated using {model_choice} with custom message", use_column_width=True)
190
 
191
  # Preview the placement
192
- st.write(f"Message preview (vertical position: {position_vertical}, horizontal position: {position_horizontal}, font: {font_choice}, size: {font_size}, max chars: {max_chars}, bg color: {bg_color}, font color: {font_color})")
193
 
194
  except Exception as e:
195
  st.error(f"An error occurred: {e}")
 
5
  from io import BytesIO
6
  import streamlit as st
7
  import textwrap
8
+ from PIL import ImageColor
9
+
10
 
11
  # Set page configuration
12
  st.set_page_config(page_title="FLUX Image Generation Tool", page_icon="🎇")
 
57
  "A lively Independence Day celebration with colorful fireworks lighting up the night sky, flags waving in the breeze, and a peaceful lakeside reflecting the celebration"
58
  ]
59
 
60
+ # Example messages corresponding to each holiday prompt
61
+ example_messages = [
62
+ "Wishing you peace and serenity this winter season. May the snow bring you joy and tranquility!",
63
+ "May your Christmas be as cozy and warm as a cabin in the woods, filled with holiday lights and love.",
64
+ "Warm wishes for the holidays! May your hearth and home be filled with love and joy this season.",
65
+ "Happy Hanukkah! May the light of the menorah shine brightly and bring joy to your heart.",
66
+ "Wishing you a vibrant New Year's Eve filled with excitement, fireworks, and joy for the year ahead!",
67
+ "May the magic and mystery of Samhain fill your spirit with wonder. Have a mystical holiday!",
68
+ "Celebrating the joy of Día de Muertos! May the memories of your loved ones bring peace and happiness.",
69
+ "Wishing you a Yule season filled with the warmth of the Norse tradition and the beauty of snowy forests.",
70
+ "Happy Diwali! May the lights of the diyas and the colors of rangoli bring you prosperity and joy.",
71
+ "Wishing you a reflective and peaceful Kwanzaa. May your home be filled with love, light, and unity.",
72
+ "Happy Thanksgiving! May your table be filled with gratitude, and your heart with the warmth of togetherness.",
73
+ "Wishing you a peaceful Winter Solstice night under the full moon. May the season bring you reflection and rest.",
74
+ "May the luck of the Irish be with you! Wishing you a joyful St. Patrick's Day filled with rainbows and gold.",
75
+ "Happy Lunar New Year! May the dragon dancers bring joy, and the fireworks light up a prosperous new year.",
76
+ "Wishing you a peaceful Easter surrounded by blooming flowers and the warmth of springtime sunshine.",
77
+ "Happy Valentine's Day! May your day be filled with love, glowing candles, and heartwarming moments.",
78
+ "Wishing you a joyful Holi! May the colors of the festival fill your life with vibrancy and happiness.",
79
+ "Ramadan Mubarak! May the crescent moon bring you peace, and the lanterns light up your spiritual path.",
80
+ "Happy Independence Day! May the fireworks light up the sky, and may freedom continue to inspire us all."
81
+ ]
82
+
83
 
84
 
85
  # Function to make requests to the FLUX models
 
115
  return "\n".join(textwrap.fill(line, width=max_chars) for line in text.split("\n"))
116
 
117
  # Function to add the holiday message to the image
118
+ from PIL import ImageColor, ImageDraw, ImageFont, Image
119
+
120
+ # Function to add the holiday message to the image
121
+ def add_custom_message(image, message, font_path, font_size, position_vertical, position_horizontal, max_chars, bg_color, font_color, alpha):
122
  try:
123
  font = ImageFont.truetype(font_path, font_size)
124
  except IOError:
125
  font = ImageFont.load_default()
126
 
127
+ # Convert image to RGBA if it's not already
128
+ if image.mode != "RGBA":
129
+ image = image.convert("RGBA")
130
+
131
+ # Create an overlay image with the same size and transparency (RGBA mode)
132
+ overlay = Image.new("RGBA", image.size, (255, 255, 255, 0)) # Fully transparent
133
+
134
+ draw = ImageDraw.Draw(overlay)
135
 
136
  # Wrap the text based on the max_chars input
137
  message = wrap_text(message, max_chars)
 
140
 
141
  # Calculate the text bounding box dynamically
142
  text_lines = message.split("\n")
143
+ line_height = draw.textbbox((0, 0), "A", font=font)[3] # Get height of one line of text
144
  total_text_height = line_height * len(text_lines)
145
  text_width = max([draw.textbbox((0, 0), line, font=font)[2] for line in text_lines])
146
 
 
163
  # Define the padding for the background box behind the text
164
  padding = 10
165
 
166
+ # Convert the user-specified background color to RGBA and apply the alpha transparency value
167
+ bg_color_rgba = (*ImageColor.getrgb(bg_color), alpha) # Apply user-controlled transparency
168
+
169
+ # Draw the semi-transparent background rectangle on the overlay
170
+ draw.rectangle([x_pos - padding, y_pos - padding, x_pos + text_width + padding, y_pos + total_text_height + padding], fill=bg_color_rgba)
171
 
172
  # Draw the text line by line with the user-specified font color
173
  for i, line in enumerate(text_lines):
174
  draw.text((x_pos, y_pos + i * line_height), line, font=font, fill=font_color)
175
 
176
+ # Composite the overlay with the original image
177
+ combined = Image.alpha_composite(image, overlay)
178
+
179
+ return combined.convert("RGB") # Convert back to RGB for saving/display
180
+
181
+
182
+
183
 
184
  # Streamlit UI
185
  st.title("FLUX Image Generation")
 
191
  prompt = custom_prompt if selected_prompt == "Custom" else selected_prompt
192
 
193
  # Dropdown to select the model
194
+ model_choice = st.selectbox("Select the model:", ["flux-1-schnell", "flux-1-dev"])
195
+
196
+ # Dropdown to select an example message or write a custom one
197
+ selected_message = st.selectbox("Choose an example message or write your own:", options=["Custom"] + example_messages)
198
+ message = st.text_input("Enter a holiday message to add:", value=selected_message if selected_message != "Custom" else "")
199
 
200
  # Additional inputs for customizing the message
 
201
  font_choice = st.selectbox("Select a font:", list(fonts.keys()))
202
  font_size = st.slider("Select font size:", 10, 100, 40)
203
  max_chars = st.slider("Max characters per line:", 10, 100, 40) # Slider to select character wrap limit
 
206
  bg_color = st.color_picker("Pick a background color for the text box:", "#FFFFFF")
207
  font_color = st.color_picker("Pick a font color:", "#000000")
208
 
209
+ # **Add a transparency slider for controlling the alpha channel**
210
+ alpha = st.slider("Select transparency level for the background (0: fully transparent, 255: fully opaque)", 0, 255, 220)
211
+
212
  # Position options for the message (vertical and horizontal)
213
  position_vertical = st.radio("Select message vertical position:", ["Top", "Center", "Bottom"])
214
  position_horizontal = st.radio("Select message horizontal position:", ["Left", "Center", "Right"])
215
 
216
+
217
  # Button to generate images
218
  if st.button("Generate Image"):
219
  if not prompt.strip():
 
233
  # Add the holiday message to the generated image
234
  image_with_message = add_custom_message(
235
  generated_image.copy(), message, font_path, font_size,
236
+ position_vertical, position_horizontal, max_chars, bg_color, font_color, alpha
237
  )
238
 
239
  # Display the image with the message
240
  st.image(image_with_message, caption=f"Generated using {model_choice} with custom message", use_column_width=True)
241
 
242
  # Preview the placement
243
+ st.write(f"Message preview (vertical position: {position_vertical}, horizontal position: {position_horizontal}, font: {font_choice}, size: {font_size}, max chars: {max_chars}, bg color: {bg_color}, font color: {font_color}, transparency: {alpha})")
244
 
245
  except Exception as e:
246
  st.error(f"An error occurred: {e}")