Having a code that works for ages when loading and storing images, I discovered that I have one single image that breaks this code:
const string i1Path = @"c:\my\i1.jpg";
const string i2Path = @"c:\my\i2.jpg";
var i = Image.FromFile(i1Path);
i.Save(i2Path, ImageFormat.Jpeg);
The exception is:
System.Runtime.InteropServices.ExternalException occurred
A generic error occurred in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at …
As far as I can see, there is nothing special about the image. It is approx 250 pixels in size and can be opened in e.g. Windows Image Viewer or Paint.NET:
(Since the image above, after being uploaded to Stack Overflow does not produce the error anymore, I've put the original image here)
What I discovered is that upon calling the Save
method, the destination image file is being created with zero bytes.
I am really clueless on what causes the error.
My questions:
- Can you think of any special thing that would hinder .NET from saving the image?
- Is there any way (beside panicing) to narrow down these kind of errors?
Best Answer
While I still did not find out the reason what exactly caused the error when saving the image, I found a workaround to apply:
I.e. by copying the image internally into a
Bitmap
instance and saving this image instead of the original image, the error disappeared.I'm assuming that by copying it, the erroneous parts the caused the original
Save
call to fail are being removed an/or normalized, thus enabling the save operation to succeed.Interestingly, the so stored image has a smaller file on disk (16 kB) than its original source (26 kB).