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

如何在Dash应用中使用dbc.Carousel批量展示本地图片?

在Dash中用dbc.Carousel展示本地图片并实现过滤

问题分析

你尝试的三种方法均无法正常显示图片,核心原因如下:

  • 直接使用本地绝对路径:浏览器受安全限制,无法直接读取本地文件系统的绝对路径,只能通过Dash服务器提供的资源路径访问。
  • 列表推导代码语法错误:{'key': i, 'src'}是无效字典写法,未给src字段赋值。
  • Base64编码用法错误:缺少data:image/jpeg;base64,的URI前缀,且字典结构语法错误。

正确实现方式

方法1:利用Dash的Assets目录(推荐)

Dash会自动暴露assets目录下的资源,直接用相对路径即可访问。

import os
import glob
import dash
from dash import html
import dash_bootstrap_components as dbc

# 初始化Dash应用,默认会识别assets目录
app = dash.Dash(__name__, assets_folder=r"C:\Users\asdean\Documents\TagOCR\assets")

# 获取assets目录下的所有jpg图片文件名
image_path = r"C:\Users\asdean\Documents\TagOCR\assets\\"
list_of_images = [os.path.basename(x) for x in glob.glob(f"{image_path}*.jpg")]

# 生成Carousel的items列表
carousel_items = [
    {
        "key": idx,
        "src": f"/assets/{img}",  # 用相对路径访问assets下的图片
        "alt": f"Image {idx}: {img}"  # 添加alt文本,提升可访问性
    }
    for idx, img in enumerate(list_of_images)
]

# 构建布局
app.layout = html.Div([
    dbc.Carousel(
        id="carousel",
        items=carousel_items,
        controls=True,
        indicators=True,
        interval=None,
    )
])

if __name__ == "__main__":
    app.run_server(debug=True)

方法2:Base64编码方式

如果图片不在assets目录,或者需要动态生成图片内容,可以用Base64编码,但要注意格式正确:

import os
import glob
import base64
import dash
from dash import html
import dash_bootstrap_components as dbc

image_path = r"C:\Users\asdean\Documents\TagOCR\assets\\"
list_of_images = [os.path.basename(x) for x in glob.glob(f"{image_path}*.jpg")]

# 生成带正确前缀的Base64编码字符串
encoded_list = [
    f"data:image/jpeg;base64,{base64.b64encode(open(os.path.join(image_path, img), 'rb').read()).decode('utf-8')}"
    for img in list_of_images
]

# 生成Carousel的items列表
carousel_items = [
    {
        "key": idx,
        "src": encoded_img,
        "alt": f"Image {idx}: {list_of_images[idx]}"
    }
    for idx, encoded_img in enumerate(encoded_list)
]

app = dash.Dash(__name__)
app.layout = html.Div([
    dbc.Carousel(
        id="carousel",
        items=carousel_items,
        controls=True,
        indicators=True,
        interval=None,
    )
])

if __name__ == "__main__":
    app.run_server(debug=True)

后续过滤功能实现建议

要按文件名前缀过滤图片,可以通过Dash回调动态更新Carousel的items属性:

  1. 添加一个下拉菜单作为过滤控件,选项为所有可能的文件名前缀;
  2. 编写回调,监听下拉菜单的变化,过滤list_of_images中符合前缀的图片;
  3. 重新生成对应的carousel_items,并输出到Carousel的items属性。

示例代码片段:

from dash import Input, Output, dcc

# 提取所有文件名前缀(假设前缀是第一个'-'之前的部分)
prefixes = list({img.split('-')[0] for img in list_of_images})

# 更新布局,添加下拉菜单
app.layout = html.Div([
    dcc.Dropdown(
        id="prefix-filter",
        options=[{"label": prefix, "value": prefix} for prefix in prefixes],
        value=prefixes[0] if prefixes else None,
        placeholder="选择图片前缀"
    ),
    dbc.Carousel(
        id="carousel",
        controls=True,
        indicators=True,
        interval=None,
    )
])

# 回调函数:根据前缀过滤图片并更新Carousel
@app.callback(
    Output("carousel", "items"),
    Input("prefix-filter", "value")
)
def update_carousel(selected_prefix):
    if not selected_prefix:
        filtered_images = list_of_images
    else:
        filtered_images = [img for img in list_of_images if img.startswith(selected_prefix)]
    
    # 生成过滤后的items列表(这里用Assets目录的方式,Base64方式同理)
    return [
        {
            "key": idx,
            "src": f"/assets/{img}",
            "alt": f"Image {idx}: {img}"
        }
        for idx, img in enumerate(filtered_images)
    ]

内容的提问来源于stack exchange,提问作者Sam Dean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:54:28