📦 资产管理器 - 缩略图生成与展示
概述
资产管理器会自动为支持的资产生成视觉预览图(缩略图),让你在不打开文件的情况下快速识别内容。缩略图系统支持图片、视频和音频三种类型的资产,采用“前端生成+后端缓存”的混合模式。
核心价值:看一眼就知道是什么文件,无需逐个打开确认。
缩略图支持的资产类型
| 资产类型 | 缩略图生成方式 | 效果 |
|---|---|---|
| 图片 | 直接使用原图缩放 | ✅ 完整预览 |
| 视频 | 自动截取第一帧作为预览图 | ✅ 视频首帧快照 |
| 音频 | 提取内嵌专辑封面(如 MP3/FLAC) | ✅ 专辑封面 |
| 文档 | 使用文件类型图标占位 | ❌ 无缩略图 |
图片缩略图
图片类资产会直接使用原图并自动适应卡片尺寸展示。在网格视图中,你看到的预览区域就是图片的等比缩放缩略图。单击图片可打开内置图片查看器进行缩放、旋转等操作。
视频缩略图
视频类资产在首次加载时,前端会自动截取视频的第一帧作为缩略图。生成过程是异步的——在缩略图生成前会显示加载动画,生成后自动替换为视频首帧快照。
TODO: 截图 - 视频资产在缩略图生成前/后的对比(加载动画 → 首帧预览)
缩略图生成后会缓存到资产元数据中,下次打开时无需重新生成。
音频缩略图
如果音频文件(如 MP3、FLAC)内嵌了专辑封面图片,Rust 后端会自动提取并保存为缩略图。在资产卡片中会显示专辑封面,没有封面的音频文件会显示默认的音频文件图标。
TODO: 截图 - 带专辑封面的音频资产卡片 vs 无封面的图标展示
缩略图显示优化
网格视图中的缩略图
网格视图的卡片会以 1:1 的方形比例展示缩略图,图片会自动裁剪居中(object-fit: cover)。无论原图是什么尺寸,都会被流畅地展示在统一大小的预览框中。
网格视图支持三种卡片尺寸,适应不同场景:
| 卡片尺寸 | 适用场景 | 缩略图大小 |
|---|---|---|
| 小卡片 | 密集浏览大量资产 | 较小,一眼扫过 |
| 中卡片 | 默认模式,均衡 | 适中 |
| 大卡片 | 图片类资产预览为主 | 较大,看得清细节 |
TODO: 截图 - 三种卡片尺寸的对比展示
列表视图中的缩略图
列表视图在文件名左侧会显示一个较小的缩略图(40px 方形),不占太多空间的同时提供视觉识别。
加载占位
视频等需要异步生成缩略图的资产,在加载过程中会显示一个旋转的加载动画(Spinner),避免空白区域的突兀感。
缩略图处理机制
视频缩略图(前端截取)
视频缩略图的生成由前端驱动:
- 触发:当视频资产进入视口且尚未拥有缩略图时。
- 生成:前端通过视频解码器截取第一帧并转换为 Base64 格式。
- 持久化:生成的缩略图会自动发送给 Rust 后端并保存。下次加载时将直接从本地缓存读取,不再重复生成。
音频封面提取(后端解析)
音频文件的专辑封面提取由 Rust 后端利用 lofty 库实现:
- 支持格式:MP3、FLAC 等带内嵌封面元数据的音频格式
- 提取时机:资产导入时自动进行
- 落盘位置:缩略图文件会保存在与资产对应的元数据目录中
异常情况处理
缩略图加载失败
如果缩略图加载失败(例如图片损坏、视频无法解码、音频封面提取失败),系统会自动回退显示文件类型图标(通过 FileIcon 组件根据文件后缀匹配对应的图标),确保界面不会出现破碎的图片占位。
视频缩略图生成失败
视频缩略图生成依赖于前端的视频解码能力。如果遇到不支持的视频编码格式,缩略图可能无法生成,此时卡片会持续显示视频播放图标覆盖层的默认样式,不影响预览操作——单击仍可正常播放视频。
典型场景
场景一:快速扫描图片库
切换到网格视图并选择大卡片尺寸,可以直接浏览所有图片资产的缩略图,一眼找到需要的图片。
场景二:区分多个视频文件
视频缩略图展示了每个视频的第一帧画面,在网格视图中可以将不同内容的视频快速区分开,不需要逐个播放确认。
场景三:识别音频专辑
导入多个音乐文件后,通过专辑封面缩略图快速识别不同的专辑和曲目,比纯文件名浏览直观得多。
TODO: 截图 - 混合资产展示(图片缩略图、视频首帧、音频封面混合展示)