user852367
user852367

Reputation: 1030

C# - Image size increases after creating a smaller resolution of the same image

I'm unable to see why this code creates a thumbnail of an image that was previously 1280x800 with a size of 241kb to 600x375 with a size of 556kb. Here is the code:

using (System.Drawing.Image img = System.Drawing.Image.FromFile(@"c:\images\myImg.jpg"))
{
    int sourceWidth = img.Width;
    int sourceHeight = img.Height;
    int thumbHeight, thumbWidth = 0;
    decimal ratio = decimal.Divide(sourceHeight, sourceWidth);
    if (sourceHeight > 600 || sourceWidth > 800)
    {
        if (ratio >= 1) // Image is higher than it is wide.
        {
            thumbHeight = 800;
            thumbWidth = Convert.ToInt32(decimal.Divide(sourceWidth, sourceHeight) * thumbHeight);
        }
        else // Image is wider than it is high.
        {
            thumbWidth = 600;
            thumbHeight = Convert.ToInt32(decimal.Divide(sourceHeight, sourceWidth) * thumbWidth);
        }

        using (Bitmap bMap = new Bitmap(thumbWidth, thumbHeight))
        {
            Graphics gr = Graphics.FromImage(bMap);

            gr.SmoothingMode = SmoothingMode.HighQuality;
            gr.CompositingQuality = CompositingQuality.HighQuality;
            gr.InterpolationMode = InterpolationMode.High;

            Rectangle rectDestination = new Rectangle(0, 0, thumbWidth, thumbHeight);

            gr.DrawImage(img, rectDestination, 0, 0, sourceWidth, sourceHeight, GraphicsUnit.Pixel);

            bMap.Save(HttpContext.Current.Server.MapPath("~/i/" + filename + "_" + fileExtension));
        }
    }
}

Any help would be greatly appreciated. Thank you kindly, Ben

Upvotes: 0

Views: 1121

Answers (1)

villecoder
villecoder

Reputation: 13483

You're saving an image that used to be compressed using jpeg compression as a bitmap image that has no compression. The offending line is here:

bMap.Save(HttpContext.Current.Server
                     .MapPath("~/i/" + filename + "_" + fileExtension));

Just because you're saving it with a different file extension doesn't make the resulting image file a jpeg image. You need to use one of the Bitmap.Save overloads that specifies the format of the image you would like to save it as. For example

//Creating a second variable just for readability sake.
var resizedFilePath = HttpContext.Current.Server
             .MapPath("~/i/" + filename + "_" + fileExtension);
bMap.Save(resizedFilePath, ImageFormat.Jpeg);

Granted, you're relying on Microsoft's implementation of the compression algorithm. It's not bad, but there may be better ones out there.

Now, what you could do is use the Image.RawFormat property of the original image to determine what kind of compression to use during the Save method. I've had varying success having that retrieve the proper method, so I generally use ImageFormat.Png as a backup (Png format supports image transparency, Jpeg does not).

Upvotes: 3

Related Questions