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

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.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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;
    }
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x