0

I need a function that crops the image by its shorter dimension (in the center) to make it a square, then resizes it to a particular size. This way, I get the maximum amount of visible content into the output thumbnail and without distortions.

My resize image shrinks the image and causes distortion:

public static Image ResizeImage(Image image, Size size, bool preserveAspectRatio = true)
{
        int newWidth;
        int newHeight;

        if (preserveAspectRatio)
        {
            var originalWidth = image.Width;
            var originalHeight = image.Height;
            var percentWidth = size.Width / (float)originalWidth;
            var percentHeight = size.Height / (float)originalHeight;
            var percent = percentHeight < percentWidth ? percentHeight : percentWidth;
            newWidth = (int)(originalWidth * percent);
            newHeight = (int)(originalHeight * percent);
        }
        else
        {
            newWidth = size.Width;
            newHeight = size.Height;
        }

        Image newImage = new Bitmap(newWidth, newHeight);

        using (var graphicsHandle = Graphics.FromImage(newImage))
        {
            graphicsHandle.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphicsHandle.SmoothingMode = SmoothingMode.HighQuality;
            graphicsHandle.PixelOffsetMode = PixelOffsetMode.HighQuality;
            graphicsHandle.DrawImage(image, 0, 0, newWidth, newHeight);
        }

        return newImage;
}

Note: the crop if needed, should be done from the center of the image.

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Liron Harel
  • 10,819
  • 26
  • 118
  • 217

0 Answers0