2009-12-30 15 views
7

Quiero escalar las imágenes, pero no quiero que la imagen se vea sesgada.escalar una imagen, pero mantener sus proporciones

La imagen tiene que ser de 115x115 (largo x ancho).

La imagen no puede tener más de 115 píxeles de alto (longitud), pero si es necesario, el ancho puede ser inferior a 115 pero no más.

¿Esto es complicado?

+0

Esto parece similar a http://stackoverflow.com/questions/2823200/. Vea mi respuesta a esa pregunta. –

Respuesta

2

Usted está mirando para escalar una imagen y conservar la relación de aspecto :

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; 

debe ayudarle, y si usted está interesado en la idea: Wikpedia article on Image Aspect Ratio

+0

Después de haber probado este código (lo encontré en otro lugar mientras buscaba el mismo problema básico), en realidad no hace el trabajo si comienza con una imagen que tiene un ancho y una altura que son mayores que los máximos: usted necesita para aplicar la primera o la segunda escala dependiendo de qué dimensión de la imagen original es la más grande, de lo contrario terminará con una de las dimensiones que es mayor que el máximo permitido en cualquiera de las escalaciones. – Moo

5

necesita conservar la relación de aspecto:

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; 

    } 

En el código, Inicialmente newWidth/newHeight son anchura/altura de la imagen.

+0

Si newHeight o newWidth es un número entero, no funcionará correctamente, necesitará un molde para 'flotar '. – BrunoLM

4

Sobre la base de la respuesta de Brij Hice este método de extensión:

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

El método de cambio de tamaño:

/// <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); 
} 
+0

en lugar de img.Height, img.Source.Height funcionó para mí (VS 2010 .net 4). además, se utilizó Source para Ancho – mnemonic

Cuestiones relacionadas