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

如何获取、缩放图片并保存至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);

第二段代码的问题

  1. 流位置未重置:调用resizeImage.Save(resizeImageStream, ImageFormat.Jpeg)后,resizeImageStream的指针已经移动到流的末尾,此时执行CopyTo不会读取到任何数据,最终写入文件的内容为空或无效。
  2. 流的读写兼容性问题: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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:48:16