2009-12-30 3 views
7

Je souhaite redimensionner des images, mais je ne souhaite pas que l'image soit faussée.Mise à l'échelle d'une image, mais conserve ses proportions

L'image doit être de 115 x 115 (longueur x largeur).

L'image ne peut pas dépasser 115 pixels (longueur), mais si nécessaire, la largeur peut être inférieure à 115, mais pas plus.

Est-ce difficile?

+0

Cela semble similaire à http://stackoverflow.com/questions/2823200/. Voyez ma réponse à cette question. –

Répondre

2

Vous êtes à la recherche à l'échelle d'une image et de préserver 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; 

devrait vous aider, et si vous êtes intéressé par l'idée: Wikpedia article on Image Aspect Ratio

+0

Après avoir essayé ce code (trouvé ailleurs où en cherchant le même problème de base), il ne fait pas le travail si vous démarrez avec une image qui a une largeur et une hauteur supérieures aux maximums - vous avez besoin pour appliquer la première ou la seconde échelle en fonction de la dimension de l'image originale la plus grande, sinon l'une des dimensions est plus grande que le maximum autorisé dans l'une ou l'autre des mises à l'échelle. – Moo

5

Vous devez conserver le rapport d'aspect:

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; 

    } 

Dans le code, dans un premier newWidth/newHeight sont largeur/hauteur de l'image.

+0

Si newHeight ou newWidth est un nombre entier, il ne fonctionnera pas correctement, vous aurez besoin d'un cast pour 'float'. – BrunoLM

4

Sur la base de la réponse de Brij J'ai fait cette méthode d'extension:

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

La méthode de modification de taille:

/// <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

au lieu de img.Height, img.Source.Height a travaillé pour moi (VS 2010 .net 4). en outre, Source a été utilisé pour la largeur – mnemonic