Reputation: 1030
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
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