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

Xamarin.Forms(UWP平台)如何将ImageSource.FromFile转换为Stream?

在UWP中将本地存储的图片转换为Stream的解决方案

你之前用StorageFile.GetFileFromApplicationUriAsync()报错,是因为这个方法专门用来访问应用安装包内的资源(比如Assets文件夹里的预设文件),而你的图片存在应用的本地存储目录(也就是FileSystem.AppDataDirectory对应的UWP本地文件夹),完全是两个不同的存储区域,自然会抛出异常。

下面给你两种可行的实现方式,按需选择:


方法一:直接用已有的文件路径获取Stream

既然你已经有了完整的文件路径,可以直接通过路径定位文件并转换:

string location = Path.Combine(FileSystem.AppDataDirectory, "data", "Demo.jpg");

// 用GetFileFromPathAsync获取本地存储的文件(这才是对应本地目录的正确API)
StorageFile targetFile = await StorageFile.GetFileFromPathAsync(location);

// 将UWP专属流转换为.NET标准Stream
using (IRandomAccessStream uwpStream = await targetFile.OpenAsync(FileAccessMode.Read))
{
    using (Stream dotNetStream = uwpStream.AsStreamForRead())
    {
        // 如果需要长期使用,建议复制到MemoryStream(避免原流被释放)
        MemoryStream memoryStream = new MemoryStream();
        await dotNetStream.CopyToAsync(memoryStream);
        memoryStream.Position = 0; // 重置流的读取位置,避免从末尾开始读取

        // 这里就可以用memoryStream做后续操作了,比如上传、图片处理等
    }
}

方法二:通过UWP本地文件夹API定位文件(更符合UWP习惯)

如果你不想拼接路径,可以直接通过UWP的LocalFolder逐级定位文件,能避免路径格式出错的问题:

// 获取应用的本地存储根文件夹
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
// 定位到"data"子文件夹
StorageFolder dataFolder = await localFolder.GetFolderAsync("data");
// 获取目标图片文件
StorageFile targetFile = await dataFolder.GetFileAsync("Demo.jpg");

// 后续转换Stream的代码和方法一完全一致
using (IRandomAccessStream uwpStream = await targetFile.OpenAsync(FileAccessMode.Read))
{
    using (Stream dotNetStream = uwpStream.AsStreamForRead())
    {
        MemoryStream memoryStream = new MemoryStream();
        await dotNetStream.CopyToAsync(memoryStream);
        memoryStream.Position = 0;

        // 执行你的业务逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:08:10