如何在Streamlit程序切换应用模式时保留图像修改结果
问题根因
Streamlit 每次用户触发交互时都会重新执行完整脚本,函数内的普通局部变量会在重跑时被完全重置,这就是你修改普通变量无法留存处理结果的根本原因。
解决方法
使用 Streamlit 内置的 st.session_state 会话状态存储需要跨重跑保留的数据,核心要存储原始上传图、当前处理后的工作图两个核心变量,处理逻辑调整为每次用工作图作为输入,处理完成后更新工作图即可。
调整后的完整代码
import streamlit as st from PIL import Image # 导入你自己的处理模块 import colorize import night_images def main(): st.title("Image Restoration") # 初始化会话状态,跨重跑留存数据 if "original_img" not in st.session_state: st.session_state.original_img = None if "working_img" not in st.session_state: st.session_state.working_img = None if "uploaded_file_id" not in st.session_state: st.session_state.uploaded_file_id = None # 定义应用模式 colorizationPage = "Image Colorization" inpaintingPage = "Image Inpainting" enhancementPage = "Image Enhancement" # 修正原拼写错误 denoisingPage = "Image Denoising" appMode = st.sidebar.selectbox( "Choose the app mode", [ colorizationPage, inpaintingPage, enhancementPage, denoisingPage ]) # 可选:加重置按钮,一键回到原始图 if st.sidebar.button("重置为原始图像") and st.session_state.original_img: st.session_state.working_img = st.session_state.original_img.copy() st.success("已重置为原始图像") st.header(appMode) # 图片上传逻辑 imgFile = st.file_uploader("Choose an image file") if imgFile is None: st.text("You haven't uploaded an image file") else: # 只有上传新文件时才更新原始图和工作图 if imgFile.file_id != st.session_state.uploaded_file_id: st.session_state.original_img = Image.open(imgFile).convert("RGB") st.session_state.working_img = st.session_state.original_img.copy() st.session_state.uploaded_file_id = imgFile.file_id # 图像着色 if appMode == colorizationPage: original, colorized = st.columns(2) # 用当前工作图作为输入 result = colorize.colorize(st.session_state.working_img) # 更新工作图为处理后的结果,后续切换模式直接用该结果 st.session_state.working_img = result original.header("Original") original.image(st.session_state.original_img, use_column_width = True) colorized.header("Colorized") colorized.image(result, use_column_width = True) # 图像增强 if appMode == enhancementPage: original, enhanced = st.columns(2) res = night_images.enhance(st.session_state.working_img) st.session_state.working_img = res original.header("Original Image") original.image(st.session_state.original_img, use_column_width = True) enhanced.header("Enhanced Image") # 修正原注释错误 enhanced.image(res, use_column_width = True) if __name__ == "__main__": main()
补充说明
- 所有模式的输入都替换成了
st.session_state.working_img,每次处理完成后都会更新这个值,切换模式时会自动读取上一次处理后的结果作为输入 - 新增的重置按钮可以快速回到原始上传的图像,无需重新上传
- 用文件的
file_id判断是否是新上传的文件,避免重复加载同一个文件覆盖已经处理好的结果
内容的提问来源于stack exchange,提问作者ransomware
相关产品推荐
相关产品推荐

