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

egui中检查图片加载状态的多种方法及图片状态查询API疑问

egui中检查图片加载状态的多种方法及图片状态查询API疑问

我来针对你的问题详细解答下:


1. 当前方法的实用性及其他检查加载状态的方式

你的当前实现是可行且务实的——load_for_size返回的TexturePoll确实是egui原生提供的用来检查图片加载状态的标准方式,能直接拿到Pending/Ready/Failed状态,逻辑清晰且符合egui的设计思路。

不过如果想要更简洁的实现,还有这些替代方案:

  • 封装状态检查逻辑:把状态判断的代码封装成工具函数,避免重复编写临时变量和匹配逻辑,比如:
    fn is_image_loaded(ctx: &egui::Context, uri: &str, size: egui::Vec2) -> bool {
        let img = egui::Image::from_uri(uri.to_string())
            .max_height(size.y)
            .max_width(size.x);
        matches!(img.load_for_size(ctx, size), Ok(egui::load::TexturePoll::Ready(_)))
    }
    
    之后你只需要调用这个函数就能直接获取加载状态,不用每次都写重复代码。
  • 自定义图片加载器:如果需要全局统一管理加载状态,可以实现egui::Load trait,自己维护一个全局的加载状态映射表(比如HashMap<String, LoadingState>),这样所有图片的加载状态都能在一个地方查询,不用每次触发加载才能检查。
  • 除了TexturePoll/ImagePoll,egui目前没有其他原生的公开API直接检查图片加载状态,因为加载逻辑是和load_for_size这类触发加载的操作绑定的。

2. 通过URI查询图片状态的可能性

你说得很对:egui确实通过URI作为图片缓存的唯一标识,ctx.forget_image(uri)能通过URI清理图片,说明内部是用URI索引图片资源的。但截至egui的当前稳定版本,并没有公开的ctx.info_image(uri)这类API——因为egui的TextureManager(管理图片缓存的核心组件)的内部状态是私有的,没有对外暴露查询接口。

不过我们可以通过以下方式模拟这个需求:

  • 自己维护全局状态映射:在你的App状态中定义一个HashMap<String, egui::load::TexturePoll>(或者自定义的ImageLoadingState枚举),每次调用load_for_size时,将对应的URI和状态存入这个Map。之后你就可以随时通过URI查询状态,相当于自己实现了info_image的功能。同时,当你调用ctx.forget_image(uri)时,记得同步从这个Map中移除对应的条目,保持状态一致。
  • 利用egui的全局内存存储:如果不想把状态存在App结构体里,可以用ctx.memory().data来存储全局状态。比如定义一个自定义的键类型:
    #[derive(Clone, PartialEq, Eq, Hash)]
    struct ImageStatusKey(String);
    
    // 存储状态
    ctx.memory().data.insert_permanent(ImageStatusKey(uri.to_string()), loading_state);
    
    // 查询状态
    let status = ctx.memory().data.get::<ImageStatusKey>(&ImageStatusKey(uri.to_string()));
    
    这种方式可以跨组件访问图片状态,不用传递App状态。

针对你的核心需求的总结

如果想要“不生成额外变量、不初始化时本地获取,直接从context查状态”,egui原生做不到,但你可以基于ctx.memory().data自己实现一个全局的图片状态跟踪系统——这和egui内部的缓存逻辑对齐,既可以通过URI快速查询状态,又不用重复编写加载检查的代码。

备注:内容来源于stack exchange,提问作者black_hole_sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:53:02