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

如何在MAUI中从Resources/Images目录加载SKBitmap

解决MAUI中从Resources/Images加载图片为SKBitmap的问题

你的问题核心在于:SkiaSharp的SKBitmap.Decode无法识别MAUI的资源路径规则。XAML中的Image控件会通过MAUI的资源系统自动将文件名映射到正确的平台资源位置,但直接用FileImageSource的字符串路径传递给SkiaSharp时,它会尝试在本地文件系统查找物理文件,而Resources/Images下的文件是嵌入到应用包中的,并非独立的物理文件,所以找不到。

正确的加载方法

直接通过MAUI的FileSystem API获取资源文件的流,再用SkiaSharp解码这个流:

private async Task LoadImageAsync()
{
    // 资源路径要和项目中的实际路径一致,注意大小写
    string resourcePath = "Resources/Images/pain_man.png";
    using var stream = await FileSystem.OpenAppPackageFileAsync(resourcePath);
    
    if (stream != null)
    {
        _preloadedBitmap = SKBitmap.Decode(stream);
    }
}

补充说明

  1. 确保文件的生成操作正确:右键图片文件 → 属性,将「生成操作」设置为MauiImage,这样MAUI会在编译时正确处理该资源,在各平台打包时包含进去。
  2. 异步调用注意事项:因为OpenAppPackageFileAsync是异步方法,你需要在合适的生命周期事件中调用它,比如自定义控件的Loaded事件:
protected override async void OnLoaded()
{
    base.OnLoaded();
    await LoadImageAsync();
    // 执行后续渲染逻辑
}

替代方案(同步加载)

如果需要同步加载,可以通过程序集获取嵌入资源流(注意资源名称是项目命名空间+路径,比如你的项目命名空间是MyApp,则资源名称为MyApp.Resources.Images.pain_man.png):

private void LoadImage()
{
    var assembly = typeof(YourCustomControl).Assembly;
    string resourceName = "YourProjectNamespace.Resources.Images.pain_man.png";
    
    using var stream = assembly.GetManifestResourceStream(resourceName);
    if (stream != null)
    {
        _preloadedBitmap = SKBitmap.Decode(stream);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:19