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

.NET MAUI如何从外部存储加载图片至Image组件?

解决方案

针对.NET MAUI Android平台无法从应用私有存储加载图片的问题,提供以下几种可行替代方案:

方案1:使用文件流加载(最简单的替代方式)

绕过ImageSource.FromFile的底层兼容性问题,直接读取文件流创建ImageSource:

protected override void OnAppearing()
{
    base.OnAppearing();
    var filePath = Path.Combine(FileSystem.AppDataDirectory, "test.jpg");
    if (File.Exists(filePath))
    {
        using var fileStream = File.OpenRead(filePath);
        MyImage.Source = ImageSource.FromStream(() => fileStream);
    }
}

方案2:平台特定代码(Android原生加载)

利用Android原生API处理图片,再转换为MAUI支持的ImageSource,彻底绕开跨平台API的问题:

protected override void OnAppearing()
{
    base.OnAppearing();
    MyImage.Source = LoadPrivateStorageImage("test.jpg");
}

private ImageSource LoadPrivateStorageImage(string fileName)
{
#if ANDROID
    var androidFilePath = Path.Combine(Android.App.Application.Context.FilesDir.AbsolutePath, fileName);
    if (!File.Exists(androidFilePath))
        return null;

    var bitmap = Android.Graphics.BitmapFactory.DecodeFile(androidFilePath);
    using var stream = new MemoryStream();
    bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, stream);
    stream.Position = 0;
    return ImageSource.FromStream(() => stream);
#else
    var filePath = Path.Combine(FileSystem.AppDataDirectory, fileName);
    return File.Exists(filePath) ? ImageSource.FromFile(filePath) : null;
#endif
}

方案3:第三方库SkiaSharp实现

SkiaSharp是跨平台图形处理库,对图片加载的兼容性更强,需先安装SkiaSharp.Views.Maui NuGet包:

using SkiaSharp;

protected override void OnAppearing()
{
    base.OnAppearing();
    var filePath = Path.Combine(FileSystem.AppDataDirectory, "test.jpg");
    if (File.Exists(filePath))
    {
        using var skBitmap = SKBitmap.Decode(filePath);
        using var stream = new MemoryStream();
        skBitmap.Encode(SKEncodedImageFormat.Jpeg, 100).SaveTo(stream);
        stream.Position = 0;
        MyImage.Source = ImageSource.FromStream(() => stream);
    }
}

额外说明

  • 应用私有存储(FileSystem.AppDataDirectory)属于应用专属空间,不需要申请READ_EXTERNAL_STORAGE或READ_MEDIA_IMAGES权限,可从AndroidManifest.xml中移除这些不必要的配置。
  • 上述方案均规避了ImageSource.FromFile在Android平台的已知兼容性问题,无需使用FilePicker工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:05:01