C#:GDI +:使用位图的保存方法过度写入图像

时间:2009-06-24 02:04:13

标签: asp.net gdi+

我有一个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);
        }

如果我评论为目标文件创建新名称的第一行,IT将无法正常工作。其他人将会这样做。但我想要有相同的名称。任何想法? ?提前致谢

2 个答案:

答案 0 :(得分:19)

如果使用以下行中的技术加载图像

 Image imgPhoto = Image.FromFile("myphoto.jpg");

然后这会保持对文件的句柄打开,因此当您尝试覆盖它时,该文件仍在使用中,因此您无法写入该文件。

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

您可以通过以下方式执行此操作:

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

答案 1 :(得分:11)

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

您还需要确保原始文件此时仍未打开;确保丢弃用于填充您正在操作的Image对象的原始文件流。然后删除,然后保存。