mrblah
mrblah

Reputation: 103507

scaling an image, but keep its proportions

I want to scale images, but I don't want the image to look skewed.

The image has to be 115x115 (length x width).

The image can't be over 115 pixels high (length), but if needed, the width can be less than 115 but not more.

Is this tricky?

Upvotes: 8

Views: 9325

Answers (4)

Kristopher Ives
Kristopher Ives

Reputation: 6025

You're looking to scale an image and preserve Aspect Ratio:

float MaxRatio = MaxWidth / (float) MaxHeight;
float ImgRatio = source.Width / (float) source.Height;

if (source.Width > MaxWidth)
return new Bitmap(source, new Size(MaxWidth, (int) Math.Round(MaxWidth /
ImgRatio, 0)));

if (source.Height > MaxHeight)
return new Bitmap(source, new Size((int) Math.Round(MaxWidth * ImgRatio,
0), MaxHeight));

return source;

Should help you, and if you're interested in the idea: Wikpedia article on Image Aspect Ratio

Upvotes: 2

BrunoLM
BrunoLM

Reputation: 100331

Based on Brij's answer I made this extension method:

/// <summary>
/// Resize image to max dimensions
/// </summary>
/// <param name="img">Current Image</param>
/// <param name="maxWidth">Max width</param>
/// <param name="maxHeight">Max height</param>
/// <returns>Scaled image</returns>
public static Image Scale(this Image img, int maxWidth, int maxHeight)
{
    double scale = 1;

    if (img.Width > maxWidth || img.Height > maxHeight)
    {
        double scaleW, scaleH;

        scaleW = maxWidth / (double)img.Width;
        scaleH = maxHeight / (double)img.Height;

        scale = scaleW < scaleH ? scaleW : scaleH;
    }

    return img.Resize((int)(img.Width * scale), (int)(img.Height * scale));
}

/// <summary>
/// Resize image to max dimensions
/// </summary>
/// <param name="img">Current Image</param>
/// <param name="maxDimensions">Max image size</param>
/// <returns>Scaled image</returns>
public static Image Scale(this Image img, Size maxDimensions)
{
    return img.Scale(maxDimensions.Width, maxDimensions.Height);
}

The resize method:

/// <summary>
/// Resize the image to the given Size
/// </summary>
/// <param name="img">Current Image</param>
/// <param name="width">Width size</param>
/// <param name="height">Height size</param>
/// <returns>Resized Image</returns>
public static Image Resize(this Image img, int width, int height)
{
    return img.GetThumbnailImage(width, height, null, IntPtr.Zero);
}

Upvotes: 4

Brij
Brij

Reputation: 6122

You need to preserve aspect ratio:

float scale = 0.0;

    if (newWidth > maxWidth || newHeight > maxHeight)
    {
        if (maxWidth/newWidth < maxHeight/newHeight)
        {
            scale = maxWidth/newWidth;
        }
        else
        {
            scale = maxHeight/newHeight;
        }
        newWidth = newWidth*scale;
        newHeight = newHeight*scale;

    }

In the code, Initially newWidth/newHeight are width/Height of image.

Upvotes: 6

noocyte
noocyte

Reputation: 2522

Take a look at Bertrands blog post about scaling images using GDI and WPF.

Upvotes: 0

Related Questions