使用位图的保存方法覆盖一张图片

8
我有一个ASP.NET C#页面,我需要调整文件夹中的图像大小。我使用GDI+来实现这一点。我想要调整图像的大小并替换旧图像。
当我尝试使用现有名称保存时,Save方法会抛出错误。但如果我给一个不同的名称,则可以保存。但是我希望新创建的调整大小的图像具有相同的文件名,因为我需要用调整大小的新文件覆盖现有文件。我该怎么做?
我的代码如下:
     oldImagePath= oldImagePath.Replace(".jpg", "NEW.jpg");
        
        try
        {
            ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders();
            EncoderParameters Params = new EncoderParameters(1);
            Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
            target.Save(oldImagePath, Info[1], Params);
        }

如果我注释掉第一行创建目标文件的新名称,它将无法工作,否则它会。但我想要相同的名称。我该如何实现这个目标?
2个回答

19
如果您使用以下行中的技术加载图像
 Image imgPhoto = Image.FromFile("myphoto.jpg");

如果保持文件句柄打开,当您尝试覆盖它时,文件仍然处于使用状态,因此无法写入该文件。

为了解决这个问题,如果将文件加载到流中,那么可以自由地覆盖原始文件,因为文件句柄已被释放,图像信息已被写入内存。

可以按照以下方式实现:

FileStream fs = new FileStream("myphoto.jpg", FileMode.Open);
Image imgPhoto = Image.FromStream(fs);
fs.Close();

1
您必须在 Image 的生命周期内保持该流打开。 - Tewr

11

您需要先删除原始文件。重要的是要区分 - 在使用.NET进行图像处理时,您正在处理一个在内存中的对象,其字节是通过读取原始图像填充的。您不是在处理实际的原始图像。因此,当您尝试保存这个完全新的对象(它恰好使用现有图像的数据),并且尝试使用已经在使用的路径时,您会收到异常。

同时,您还需要确保此时原始文件没有仍处于打开状态;请确保处理图像对象时使用的原始文件流被释放。然后再删除、保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接