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
相关产品推荐
相关产品推荐

