Resize image gdi+ graphics .net

.net, c#, gdi+

Solution

Look at the documentation for Image.FromStream()

http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx

You need to keep the stream open for the lifetime of the Image. Keep the first MemoryStream open longer, and it should work.

Problem

I have this method for shrinking down an image for a website that I'm working on: ``` static byte[] createSmallerImage( BlogPhoto blogPhoto, int newMaxWidth, int newMaxHeight) { Image img; using (MemoryStream originalImage = new MemoryStream(blogPhoto.BlogPhotoImage)) { img = Image.FromStream(originalImage); } int newWidth; int newHeight; byte[] arr; if (img.Width > img.Height) { if (img.Width <= newMaxWidth) { using (MemoryStream thumbStr = new MemoryStream()) { img.Save(thumbStr, ImageFormat.Jpeg); img.Dispose(); arr = thumbStr.ToArray(); } return arr; } newWidth = newMaxWidth; newHeight = (int)(((float)newWidth / (float)img.Width) * (float)img.Height); } else { if (img.Height <= newMaxHeight) { using (MemoryStream thumbStr = new MemoryStream()) { img.Save(thumbStr, ImageFormat.Jpeg); img.Dispose(); arr = thumbStr.ToArray(); } return arr; } newHeight = newMaxHeight; newWidth = (int)(((float)newHeight / (float)img.Height) * (float)img.Width); } Image thumb = new Bitmap(newWidth, newHeight); Graphics g = Graphics.FromImage(thumb); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; g.DrawImage(img, 0f, 0f, (float)newWidth, (float)newHeight); using (MemoryStream thumbStr = new MemoryStream()) { thumb.Save(thumbStr, ImageFormat.Jpeg); arr = thumbStr.ToArray(); } g.Dispose(); img.Dispose(); return arr; } ``` Most of the time it works great but sometimes it gives me this exception:A generic error occurred in GDI+. Error Code -2147467259. Source: "System.Drawing". This occurs on the Image.Save(... I tried to make this code as defensive as possible but am still not getting whats causing this. If someone knows the answer that'd be great, critiques are welcome too.

Original source