How to find reason for Generic GDI+ error when saving an image?

Uwe Keim picture Uwe Keim · Mar 22, 2013 · Viewed 96.9k times · Source

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:

enter image description here

(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?

Answer

Uwe Keim picture Uwe Keim · Mar 24, 2013

While I still did not find out the reason what exactly caused the error when saving the image, I found a workaround to apply:

const string i1Path = @"c:\my\i1.jpg";
const string i2Path = @"c:\my\i2.jpg";

var i = Image.FromFile(i1Path);

var i2 = new Bitmap(i);
i2.Save(i2Path, ImageFormat.Jpeg);

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.

saved image i2.jpg

Interestingly, the so stored image has a smaller file on disk (16 kB) than its original source (26 kB).