views:

370

answers:

4

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?

+1  A: 

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 http://bit.ly/d4klf

Kristopher Ives
Having just tried this code (found it else where while searching for the same basic problem), it doesn't actually do the job if you start out with an image that has both width and height that are larger than the maximums - you need to apply either the first or second scaling depending on which dimension of the original image is greatest, otherwise you end up with one of the dimensions being larger than the maximum allowable in either of the scalings.
Moo
A: 

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

noocyte
+3  A: 

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.

Brij