This method is a modified version of Mike Borozdin method which I happen to enjoy very much. The biggest changes I made where to add using statements around the disposable objects such as the Bitmap and the Graphics object to avoid memory leaks, as well as a few minor changes.
//Image Resize Helper Method private static Bitmap ResizeImage(String filename, int maxWidth, int maxHeight) { using (Image originalImage = Image.FromFile(filename)) { //Caluate new Size int newWidth = originalImage.Width; int newHeight = originalImage.Height; double aspectRatio = (double)originalImage.Width / (double)originalImage.Height; if (aspectRatio <= 1 && originalImage.Width > maxWidth) { newWidth = maxWidth; newHeight = (int)Math.Round(newWidth / aspectRatio); } else if (aspectRatio > 1 && originalImage.Height > maxHeight) { newHeight = maxHeight; newWidth = (int)Math.Round(newHeight * aspectRatio); } Bitmap newImage = new Bitmap(newWidth, newHeight); using (Graphics g = Graphics.FromImage(newImage)) { //--Quality Settings Adjust to fit your application g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height); return newImage; } } }