I’m unable to see why this code creates a thumbnail of an image that was previously 1280×800 with a size of 241kb to 600×375 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
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:
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.Saveoverloads that specifies the format of the image you would like to save it as. For exampleGranted, 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.RawFormatproperty of the original image to determine what kind of compression to use during theSavemethod. I’ve had varying success having that retrieve the proper method, so I generally useImageFormat.Pngas a backup (Png format supports image transparency, Jpeg does not).