Resize image in .NET

Posted by Joe Enos on May 12, 2021 · 15 mins read

This will resize image to be 1024 height or width (whichever is bigger). Explore other options to look for things like image quality.

using (var image = Image.FromFile(file.FullName))
{
int newHeight, newWidth;
if (image.Height > image.Width)
{
newHeight = 1024;
newWidth = (int)(1024.0 * image.Width / image.Height);
}
else
{
newWidth = 1024;
newHeight = (int)(1024.0 * image.Height / image.Width);
}
using (var newImage = new Bitmap(image, new Size(newWidth, newHeight)))
{
newImage.Save(Path.Combine(outputDir.FullName, file.Name), ImageFormat.Jpeg);
}
}

// A more complete example:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;


namespace ConsoleApplication8
{
/// <summary>
/// http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/a43fe625-a5cd-4438-895f-3ddeec6eb866
/// </summary>
class Program
{
static void Main(string[] args)
{
var image = Image.FromFile(@"C:\Users\ENOSJ\Downloads\orig.jpg");
foreach (int width in new[] { 100, 200, 300, 400 })
{
//var newImage = (Image)image.Clone();
var scale = (decimal)image.Width / image.Height;
int newWidth = width;
int newHeight = (int)(newWidth / scale);
//var thumbnail = newImage.GetThumbnailImage(newWidth, newHeight, () => true, IntPtr.Zero);
//newImage.PhysicalDimension.Height = newHeight;
var newImage = ResizeImage(image, newWidth, newHeight);
SaveJpeg(string.Format(@"C:\temp\thumbnail-{0}-25.jpg", width), newImage, 25);
SaveJpeg(string.Format(@"C:\temp\thumbnail-{0}-50.jpg", width), newImage, 50);
SaveJpeg(string.Format(@"C:\temp\thumbnail-{0}-75.jpg", width), newImage, 75);
SaveJpeg(string.Format(@"C:\temp\thumbnail-{0}-100.jpg", width), newImage, 100);
//newImage.Save(@"C:\temp\thumbnail.jpg", ImageFormat.Jpeg);
newImage.Save(string.Format(@"C:\temp\thumbnail-{0}.png", width), ImageFormat.Png);
}
}


public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height)
{
//a holder for the result
Bitmap result = new Bitmap(width, height);


//use a graphics object to draw the resized image into the bitmap
using (Graphics graphics = Graphics.FromImage(result))
{
//set the resize quality modes to high quality
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//draw the image into the target bitmap
graphics.DrawImage(image, 0, 0, result.Width, result.Height);
}


//return the resulting bitmap
return result;
}


public static void SaveJpeg(string path, Image image, int quality)
{
//ensure the quality is within the correct range
if ((quality < 0) || (quality > 100))
{
//create the error message
string error = string.Format("Jpeg image quality must be between 0 and 100, with 100 being the highest quality. A value of {0} was specified.", quality);
//throw a helpful exception
throw new ArgumentOutOfRangeException(error);
}


//create an encoder parameter for the image quality
EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
//get the jpeg codec
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");


//create a collection of all parameters that we will pass to the encoder
EncoderParameters encoderParams = new EncoderParameters(1);
//set the quality parameter for the codec
encoderParams.Param[0] = qualityParam;
//save the image using the codec and the parameters
image.Save(path, jpegCodec, encoderParams);
}


public static ImageCodecInfo GetEncoderInfo(string mimeType)
{
//do a case insensitive search for the mime type
string lookupKey = mimeType.ToLower();


//the codec to return, default to null
ImageCodecInfo foundCodec = null;


//if we have the encoder, get it to return
if (Encoders.ContainsKey(lookupKey))
{
//pull the codec from the lookup
foundCodec = Encoders[lookupKey];
}


return foundCodec;
}


/// <summary>
/// A quick lookup for getting image encoders
/// </summary>
private static Dictionary<string, ImageCodecInfo> encoders = null;


/// <summary>
/// A quick lookup for getting image encoders
/// </summary>
public static Dictionary<string, ImageCodecInfo> Encoders
{
//get accessor that creates the dictionary on demand
get
{
//if the quick lookup isn't initialised, initialise it
if (encoders == null)
{
encoders = new Dictionary<string, ImageCodecInfo>();
}


//if there are no codecs, try loading them
if (encoders.Count == 0)
{
//get all the codecs
foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
{
//add each codec to the quick lookup
encoders.Add(codec.MimeType.ToLower(), codec);
}
}


//return the lookup
return encoders;
}
}
}
}