Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# :GDI+ : OverWriting an Image using Save Method of Bitmap

Tags:

asp.net

gdi+

I have an ASP.NET C# page where i am resizing the images in a folder .I am using GDI+ to do this.I want to resize the images and replace with the old images.So when i am trying to save with the existing name ,Save method is throwing an error .But if i give a different name it is getting saved.But i want to have the same file name for the newly created resized image as i need to overwrite the existing file with the new file which is resized. Any idea how to go ahead. My code is

     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);
        }

if i comment the first line which creates a new name for the destination file, IT will not work.,other wose it will.But i want to have the same name .Any thought ?? ? Thanks in advance

like image 309
Shyju Avatar asked Jun 24 '09 02:06

Shyju


2 Answers

If you load an image using the technique in the following line

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

then this keeps a handle open to the file so when you attempt to overwrite it the file is still currently in use and so you are unable to write to it.

To get around this, if you load the file into a stream then this allows you to overwrite the original file as the file handle has been freed as the image information has been written to memory.

You can do this in the following way:

FileStream fs = new FileStream("myphoto.jpg", FileMode.Open);
Image imgPhoto = Image.FromStream(fs);
fs.Close();
like image 198
Soultech Avatar answered Sep 18 '22 20:09

Soultech


You need to delete the original file first. It is important to make the distinction - when you are working with image manipulation in .NET, you are working with an in-memory object whose bytes were populated by reading the original image. You are not working with the actual original image. So when you go to save this entirely new object (which happens to use data from an existing image), and you try to use an already in-use path, you will get an exception.

You also need to make sure the original file is not still open at this point; make sure to dispose of the original file stream you used to populate the Image object you're manipulating. Then delete, then save.

like image 36
Rex M Avatar answered Sep 19 '22 20:09

Rex M