2009-04-01 7 views
14

¿Es posible cambiar el tamaño de la imagen proporcionalmente de forma independiente del tipo de imagen (bmp, jpg, png, etc.)?Cómo cambiar el tamaño proporcional de la imagen de cualquier tipo en .NET?

tengo este código y sé que falta algo (pero no sé qué):

public bool ResizeImage(string fileName, string imgFileName, 
    ImageFormat format, int width, int height) 
{ 
    try 
    { 
     using (Image img = Image.FromFile(fileName)) 
     { 
      Image thumbNail = new Bitmap(width, height, img.PixelFormat); 
      Graphics g = Graphics.FromImage(thumbNail); 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      g.DrawImage(img, rect); 
      thumbNail.Save(imgFileName, format); 
     } 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

Si no es posible, en qué proporciones de la imagen jpeg puedo cambiar el tamaño de I?

Sé que usando this method, pero no sé dónde poner esto (!).

+5

8-bits requieren re-cuantificación y volver a ser difuminado al cambiar de tamaño (que no es trivial!). La mejor solución es utilizar una biblioteca administrada que esté diseñada para manejar todos los formatos/casos de borde correctamente, mantener la relación de aspecto, etc. [La biblioteca de ImageResizer] (http://imageresizingin.net/) es una herramienta comprobada para esta tarea así como recortar, rotar y voltear. Es de código abierto, por lo que si le apetece rodar su propia solución, solo copie y pegue. También permite muchas otras cosas útiles a través de complementos, como marca de agua, almacenamiento en caché de disco, blobs sql, lectura S3, etc. –

+0

Vine aquí para mejorar mi sistema de ajuste de tamaño de la imagen y descubrí The ImageResizer Library. Es excelente. +1 para el lingüista informático! – Chris

+1

La URL en la respuesta anterior de Computer Linguist debe ser: http://imageresizing.net/ – glenatron

Respuesta

16

En primer lugar, no está tomando la altura y el ancho ACTUAL de la imagen. Para poder redimensionar proporcionalmente, necesitará obtener el alto/ancho actual de la imagen y cambiar el tamaño de acuerdo con eso.

A partir de ahí, encuentre el atributo más grande y redimensione proporcionalmente en función de eso.

Por ejemplo, digamos que la imagen actual es de 800 x 600 y que desea cambiar el tamaño proporcionalmente dentro de un espacio de 400 x 400. Coge la mayor proporción (800) y encuentra su relación con el nuevo tamaño. 800 -> 400 = .5 Ahora tome esa proporción y multiplique por la segunda dimensión (600 * .5 = 300).

El nuevo tamaño es de 400 x 300. He aquí un ejemplo de PHP (lo siento .... obtendrá él sin embargo)

$thumb_width = 400; 
$thumb_height = 400; 

$orig_w=imagesx($src_img); 
$orig_h=imagesy($src_img);  

if ($orig_w>$orig_h){//find the greater proportion 
    $ratio=$thumb_width/$orig_w; 
    $thumb_height=$orig_h*$ratio; 
}else{ 
    $ratio=$thumb_height/$orig_h; 
    $thumb_width=$orig_w*$ratio; 
} 
9

Creo que su código está muy bien, pero teniendo en la anchura y la altura como parámetros es donde te equivocas en mi opinión. ¿Por qué la persona que llama de este método debe decidir qué tan grande quieren el ancho y la altura? Yo sugeriría cambiar a un porcentaje: PNG y GIF

public bool ResizeImage(string fileName, string imgFileName, 
    ImageFormat format, int percent) 
{ 
    try 
    { 
     using (Image img = Image.FromFile(fileName)) 
     { 
      int width = img.Width * (percent * .01); 
      int height = img.Height * (percent * .01); 
      Image thumbNail = new Bitmap(width, height, img.PixelFormat); 
      Graphics g = Graphics.FromImage(thumbNail); 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      g.DrawImage(img, rect); 
      thumbNail.Save(imgFileName, format); 
     } 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 
+6

Puede ser muy relevante para la persona que llama saber la dimensión exacta en la que desea que esté la imagen ... por ejemplo, si tengo una imagen eso es 1024X768 y quiero que se reduzca a 50X50 para una miniatura, no debería tener que calcular el porcentaje. Personalmente, estandarizaría el ancho/alto y proporcionaría una sobrecarga porcentual que finalmente llamará a la versión de ancho/alto. Lo mejor de ambos y no mucho código adicional. – ctorx

+0

Sé que este es un comentario antiguo, pero ... Personalmente proporcionaría ancho o alto como restricción y mantendría la relación de aspecto para que las imágenes no se distorsionen por completo. Incluso puede que desee cambiar el tamaño del borde más grande a 50, sin importar si es el alto o el ancho. –

Cuestiones relacionadas