Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / IIS

Resizing images in ASP.NET using GDI+

2.00/5 (2 votes)
20 Dec 2009CPOL 17.6K  
Resizing images in ASP.NET using GDI+.

Introduction

I was getting Out of Memory exceptions with my website which is hosted with M6.net. This turned out to be a result of using the Stream class within a few of my image resizing methods. I looked into converting it to using GDI+ instead, which seems to munch on less memory. It also produces a quality resized image.

Using the code

The GetEncoder helper method selects the most appropriate JPEG encoder. I also have the current Server object as a static variable for convenience.

The ResizeImage method does a few things. Firstly, it determines the proportions of the new image. After that, it creates a new bitmap object and finally creates and saves the new image. Simple.

Please note that I use ~/ relative paths in my code so you will need to tweak this if you want to use physical paths.

C#
#region Using Directives

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

#endregion Using Directives

public class ImageResizer
{
    #region Fields

    static HttpServerUtility Server = HttpContext.Current.Server;

    #endregion Fields

    #region Get Encoder

    public static ImageCodecInfo GetEncoder(string mimeType)
    {
        foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
        {
            if (codec.MimeType == mimeType)
            {
                return codec;
            }
        }

        return null;
    }

    #endregion Get Encoder

    #region Resize Image

    public static void ResizeImage(string originalImageLocation, 
                  int width, int height, string newImageLocation)
    {
        Image originalImage = Image.FromFile(
          Server.MapPath(originalImageLocation.Replace("//", "/")));
        ResizeImage(originalImage, width, height, newImageLocation);
    }

    public static void ResizeImage(Image originalImage, 
                  int width, int height, string newImageLocation)
    {
        //
        // Scale the image depending on whether it is portrait or landscape.

        decimal newWidth;
        decimal newHeight;

        if ((originalImage.Width / width) > (originalImage.Width / height))
        {
            newWidth = width;
            newHeight = (Int32)Math.Ceiling(Convert.ToDecimal((
                           originalImage.Height * newWidth) / originalImage.Width));
            if (newHeight > height)
            {
                newWidth = newWidth * (height / newHeight);
                newHeight = height;
            }
        }
        else
        {
            newHeight = height;
            newWidth = Math.Ceiling(Convert.ToDecimal((
                          originalImage.Width * newHeight) / originalImage.Height));

            if (newWidth > width)
            {
                newHeight = newHeight * (width / newWidth);
                newWidth = width;
            }
        }

        //
        // Create the new image as a bitmap

        Bitmap newBitmap = new Bitmap(Convert.ToInt32(newWidth), 
                   Convert.ToInt32(newHeight), PixelFormat.Format16bppRgb565);
        Graphics g = Graphics.FromImage(newBitmap);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.DrawImage(originalImage, 0, 0, Convert.ToInt32(newWidth), 
                    Convert.ToInt32(newHeight));

        //
        // Save the image using the appropriate encoder with a quality of 98%

        ImageCodecInfo codecEncoder = ImageResizer.GetEncoder("image/jpeg");
        int quality = 98;
        EncoderParameters encodeParams = new EncoderParameters(1);
        EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
        encodeParams.Param[0] = qualityParam;
        newBitmap.SetResolution(72, 72);
        newBitmap.Save(Server.MapPath(newImageLocation), codecEncoder, encodeParams);

        //
        // Clean up

        g.Dispose();
        newBitmap.Dispose();
        originalImage.Dispose();
    }

    #endregion Resize Image
}

I hope this has been of use to you.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)