Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -3,6 +3,8 @@ import os
|
|
3 |
from PIL import Image
|
4 |
import random
|
5 |
from io import BytesIO
|
|
|
|
|
6 |
|
7 |
# Function to arrange images dynamically
|
8 |
def arrange_images(image_files, canvas_size=(3000, 3000)):
|
@@ -84,6 +86,12 @@ def arrange_images(image_files, canvas_size=(3000, 3000)):
|
|
84 |
buffer.seek(0)
|
85 |
return buffer, canvas
|
86 |
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
# Streamlit App
|
88 |
st.title("Dynamic Dungeon Map Generator")
|
89 |
st.write("Automatically generates dungeon maps by arranging PNG images dynamically.")
|
@@ -102,6 +110,8 @@ if "canvas" not in st.session_state:
|
|
102 |
st.session_state["canvas"] = None
|
103 |
if "saved" not in st.session_state:
|
104 |
st.session_state["saved"] = False
|
|
|
|
|
105 |
|
106 |
# Generate map if not saved and layout_image is empty
|
107 |
if st.session_state["layout_image"] is None or not st.session_state["saved"]:
|
@@ -116,17 +126,25 @@ if st.session_state["layout_image"] is not None:
|
|
116 |
st.image(
|
117 |
st.session_state["layout_image"],
|
118 |
caption="Generated Dungeon Map Layout",
|
119 |
-
|
120 |
output_format="PNG",
|
121 |
clamp=True,
|
122 |
)
|
123 |
|
124 |
# Save map button
|
125 |
if st.button("💾 Save Map"):
|
126 |
-
|
127 |
-
|
|
|
128 |
st.session_state["saved"] = True
|
129 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
|
131 |
# Regenerate map button
|
132 |
if st.button("🗺️ Regenerate Map"):
|
@@ -136,6 +154,7 @@ if st.button("🗺️ Regenerate Map"):
|
|
136 |
st.session_state["layout_image"] = layout_image
|
137 |
st.session_state["canvas"] = canvas
|
138 |
st.session_state["saved"] = False # Mark as unsaved
|
|
|
139 |
st.experimental_rerun()
|
140 |
|
141 |
# WASD Controls for scrolling
|
|
|
3 |
from PIL import Image
|
4 |
import random
|
5 |
from io import BytesIO
|
6 |
+
import datetime
|
7 |
+
import base64
|
8 |
|
9 |
# Function to arrange images dynamically
|
10 |
def arrange_images(image_files, canvas_size=(3000, 3000)):
|
|
|
86 |
buffer.seek(0)
|
87 |
return buffer, canvas
|
88 |
|
89 |
+
# Function to create a base64 download link
|
90 |
+
def create_download_link(image_bytes, filename):
|
91 |
+
b64 = base64.b64encode(image_bytes.getvalue()).decode()
|
92 |
+
href = f'<a href="data:image/png;base64,{b64}" download="{filename}">📥 Download {filename}</a>'
|
93 |
+
return href
|
94 |
+
|
95 |
# Streamlit App
|
96 |
st.title("Dynamic Dungeon Map Generator")
|
97 |
st.write("Automatically generates dungeon maps by arranging PNG images dynamically.")
|
|
|
110 |
st.session_state["canvas"] = None
|
111 |
if "saved" not in st.session_state:
|
112 |
st.session_state["saved"] = False
|
113 |
+
if "saved_filename" not in st.session_state:
|
114 |
+
st.session_state["saved_filename"] = None
|
115 |
|
116 |
# Generate map if not saved and layout_image is empty
|
117 |
if st.session_state["layout_image"] is None or not st.session_state["saved"]:
|
|
|
126 |
st.image(
|
127 |
st.session_state["layout_image"],
|
128 |
caption="Generated Dungeon Map Layout",
|
129 |
+
use_column_width=True,
|
130 |
output_format="PNG",
|
131 |
clamp=True,
|
132 |
)
|
133 |
|
134 |
# Save map button
|
135 |
if st.button("💾 Save Map"):
|
136 |
+
now = datetime.datetime.now()
|
137 |
+
filename = f"dungeon_map_{now.strftime('%Y%m%d_%H%M%S')}.png"
|
138 |
+
st.session_state["canvas"].save(filename)
|
139 |
st.session_state["saved"] = True
|
140 |
+
st.session_state["saved_filename"] = filename
|
141 |
+
|
142 |
+
st.success(f"Map saved as {filename}")
|
143 |
+
# Generate Base64 download link
|
144 |
+
buffer = BytesIO()
|
145 |
+
st.session_state["canvas"].save(buffer, format="PNG")
|
146 |
+
buffer.seek(0)
|
147 |
+
st.markdown(create_download_link(buffer, filename), unsafe_allow_html=True)
|
148 |
|
149 |
# Regenerate map button
|
150 |
if st.button("🗺️ Regenerate Map"):
|
|
|
154 |
st.session_state["layout_image"] = layout_image
|
155 |
st.session_state["canvas"] = canvas
|
156 |
st.session_state["saved"] = False # Mark as unsaved
|
157 |
+
st.session_state["saved_filename"] = None
|
158 |
st.experimental_rerun()
|
159 |
|
160 |
# WASD Controls for scrolling
|