如何在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); } }
补充说明
- 确保文件的生成操作正确:右键图片文件 → 属性,将「生成操作」设置为
MauiImage,这样MAUI会在编译时正确处理该资源,在各平台打包时包含进去。 - 异步调用注意事项:因为
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
相关产品推荐
相关产品推荐

