如何获取、缩放图片并保存至FileSystem.AppDataDirectory?存图无法打开排查
图片调整大小后保存无法打开的问题排查
我尝试从源路径读取图片,调整大小后保存到FileSystem.AppDataDirectory目录,但两次编写的代码保存的图片都无法打开,求问题原因。
第一段代码(保存后无法打开)
FileInfo fi = new FileInfo(photo.ImagePath); string namennoext = fi.Name.Replace(fi.Extension, ""); Stream stream = fi.OpenRead(); IImage image = PlatformImage.FromStream(stream); IImage resizeImage = image.Resize(1000, 1000); Stream resizeImageStream = resizeImage.AsStream(); long resizeImageStreamLength = resizeImageStream.Length; ImageSource resizeImageSource = ImageSource.FromStream(() => resizeImageStream); byte[] imageByteArray = new byte[resizeImageStream.Length]; File.WriteAllBytes(Path.Combine(FileSystem.AppDataDirectory, namennoext + photoDetail.JobDocDBModelId.Value.ToString() + ".jpeg"), imageByteArray);
第一段代码的问题
这段代码仅创建了一个长度匹配resizeImageStream的空字节数组imageByteArray,完全没有从流中读取任何数据到数组里,最终写入文件的是空内容,自然无法打开。
修改后的第二段代码(仍无法打开)
FileInfo fi = new FileInfo(photo.ImagePath); string namennoext = fi.Name.Replace(fi.Extension, ""); Stream stream = fi.OpenRead(); IImage image = PlatformImage.FromStream(stream); IImage resizeImage = image.Resize(1000, 1000); Stream resizeImageStream = resizeImage.AsStream(); long resizeImageStreamLength = resizeImageStream.Length; resizeImage.Save(resizeImageStream, ImageFormat.Jpeg); byte[] imageByteArray; using (MemoryStream ms = new MemoryStream()) { resizeImageStream.CopyTo(ms); imageByteArray = ms.ToArray(); } File.WriteAllBytes(Path.Combine(FileSystem.AppDataDirectory, namennoext + photoDetail.JobDocDBModelId.Value.ToString() + ".jpeg"), imageByteArray);
第二段代码的问题
- 流位置未重置:调用
resizeImage.Save(resizeImageStream, ImageFormat.Jpeg)后,resizeImageStream的指针已经移动到流的末尾,此时执行CopyTo不会读取到任何数据,最终写入文件的内容为空或无效。 - 流的读写兼容性问题:
resizeImage.AsStream()返回的流通常是只读的,直接对其执行写入操作(Save方法)不符合流的设计预期,可能导致数据写入失败。
修正后的代码
FileInfo fi = new FileInfo(photo.ImagePath); string namennoext = fi.Name.Replace(fi.Extension, ""); string savePath = Path.Combine(FileSystem.AppDataDirectory, $"{namennoext}{photoDetail.JobDocDBModelId.Value}.jpeg"); using (Stream stream = fi.OpenRead()) using (IImage image = PlatformImage.FromStream(stream)) using (IImage resizeImage = image.Resize(1000, 1000)) using (MemoryStream ms = new MemoryStream()) { // 将调整后的图片写入MemoryStream resizeImage.Save(ms, ImageFormat.Jpeg); // 重置流位置到起始处,确保后续能读取到完整数据 ms.Position = 0; // 将MemoryStream中的数据写入目标文件 using (FileStream fs = new FileStream(savePath, FileMode.Create)) { ms.CopyTo(fs); } }
修正说明
- 使用
using语句自动管理所有流和图片资源,避免资源泄漏。 - 改用独立的
MemoryStream接收保存的图片数据,避免直接操作AsStream()返回的只读流。 - 写入
MemoryStream后重置流位置到开头,确保后续复制操作能读取到完整的图片数据。
保存后的图片无法打开时的显示状态:
内容的提问来源于stack exchange,提问作者meeth_
相关产品推荐
相关产品推荐

