You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:36:04