Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize image in C# with aspect ratio and crop central image so there are no gaps

Tags:

I'm trying to resize user uploaded images to a landscape dimensions e.g. 450w and 250h while maintaining aspect ratio, but to avoid resized images like portrait images having gaps on the side I would like to crop the centre of the image to fill the resized dimensions.

I have found plenty of code to resize images while maintaining aspect ratio but not what I am looking for above, I'm hoping someone can help.

like image 531
Indy Avatar asked Apr 25 '12 20:04

Indy


People also ask

How do I resize an image in coding?

One of the simplest ways to resize an image in the HTML is using the height and width attributes on the img tag. These values specify the height and width of the image element. The values are set in px i.e. CSS pixels. For example, the original image is 640×960.


1 Answers

You should pass needToFill = true:

public static System.Drawing.Image FixedSize(Image image, int Width, int Height, bool needToFill) {     #region calculations     int sourceWidth = image.Width;     int sourceHeight = image.Height;     int sourceX = 0;     int sourceY = 0;     double destX = 0;     double destY = 0;      double nScale = 0;     double nScaleW = 0;     double nScaleH = 0;      nScaleW = ((double)Width / (double)sourceWidth);     nScaleH = ((double)Height / (double)sourceHeight);     if (!needToFill)     {         nScale = Math.Min(nScaleH, nScaleW);     }     else     {         nScale = Math.Max(nScaleH, nScaleW);         destY = (Height - sourceHeight * nScale) / 2;         destX = (Width - sourceWidth * nScale) / 2;     }      if (nScale > 1)         nScale = 1;      int destWidth = (int)Math.Round(sourceWidth * nScale);     int destHeight = (int)Math.Round(sourceHeight * nScale);     #endregion      System.Drawing.Bitmap bmPhoto = null;     try     {         bmPhoto = new System.Drawing.Bitmap(destWidth + (int)Math.Round(2 * destX), destHeight + (int)Math.Round(2 * destY));     }     catch (Exception ex)     {         throw new ApplicationException(string.Format("destWidth:{0}, destX:{1}, destHeight:{2}, desxtY:{3}, Width:{4}, Height:{5}",             destWidth, destX, destHeight, destY, Width, Height), ex);     }     using (System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto))     {         grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;         grPhoto.CompositingQuality = CompositingQuality.HighQuality;         grPhoto.SmoothingMode = SmoothingMode.HighQuality;          Rectangle to =  new System.Drawing.Rectangle((int)Math.Round(destX), (int)Math.Round(destY), destWidth, destHeight);         Rectangle from = new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight);         //Console.WriteLine("From: " + from.ToString());         //Console.WriteLine("To: " + to.ToString());         grPhoto.DrawImage(image, to, from, System.Drawing.GraphicsUnit.Pixel);          return bmPhoto;     } } 
like image 198
st78 Avatar answered Oct 25 '22 00:10

st78