using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace ConsoleApplication1
{
public class ThumbnailGenerator
{
/// <summary>
/// Generates the thumbnail of given image.
/// </summary>
/// <param name="actualImagePath">The actual image path.</param>
/// <param name="thumbnailPath">The thumbnail path.</param>
/// <param name="thumbWidth">Width of the thumb.</param>
/// <param name="thumbHeight">Height of the thumb.</param>
public static void Generate(string actualImagePath, string thumbnailPath, int thumbWidth, int thumbHeight)
{
Image orignalImage = Image.FromFile(actualImagePath);
// Rotating image 360 degrees to discart internal thumbnail image
orignalImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
orignalImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
// Here is the basic formula to mantain aspect ratio
// thumbHeight imageHeight
// ----------- = -----------
// thumbWidth imageWidth
//
// Now lets assume that image width is greater and height is less and calculate the new height
// So as per formula given above
int newHeight = orignalImage.Height * thumbWidth / orignalImage.Width;
int newWidth = thumbWidth;
// New height is greater than our thumbHeight so we need to keep height fixed and calculate the width accordingly
if (newHeight > thumbHeight)
{
newWidth = orignalImage.Width * thumbHeight / orignalImage.Height;
newHeight = thumbHeight;
}
//Generate a thumbnail image
Image thumbImage = orignalImage.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
// Save resized picture
var qualityEncoder = System.Drawing.Imaging.Encoder.Quality;
var quality = (long)100; //Image Quality
var ratio = new EncoderParameter(qualityEncoder, quality);
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
//Right now I am saving JPEG only you can choose other formats as well
var codecInfo = GetEncoder(ImageFormat.Jpeg);
thumbImage.Save(thumbnailPath, codecInfo, codecParams);
// Dispose unnecessory objects
orignalImage.Dispose();
thumbImage.Dispose();
}
/// <summary>
/// Gets the encoder for particulat image format.
/// </summary>
/// <param name="format">Image format</param>
/// <returns></returns>
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
}
}
To use this class simply call Generate function of ThumbnailGenerator class. Here is a sample:-
ThumbnailGenerator.Generate(@"C:\images\myPicture.jpg", @"C:\images\myPictureThumb.jpg", 100, 150);