2012-06-21 42 views
5

Las imágenes recién salidas de las cámaras digitales a menudo superan el tamaño de 2-3 MB, lo que dificulta su transferencia por correo electrónico y otras formas. Esto requiere que la imagen se redimensione (en términos de tamaño de archivo y no de alto o ancho). Muy similar a MS Paint que ofrece funcionalidad de cambio de tamaño de la imagen. No estoy bien educado en las teorías de archivos de imagen. Le agradecería si alguien me puede apuntar hacia las fuentes de información siguientes:Cambio de tamaño de la imagen con C#

  • teoría de la imagen (la forma en formatos de imagen distintos trabajos jpeg, gif, tiff, etc.).?

  • ¿Cómo pierde la nitidez de la imagen al cambiar el tamaño? ¿Hay alguna

  • ¿Existen bibliotecas .Net (estoy usando 4.0) gratuitas disponibles para hacer esto? Si no, ¿puedo usar cualquier biblioteca usando com interoperabilidad?

Muchas gracias,

+0

Lea sobre http://en.wikipedia.org/wiki/Color_quantization – BryanJ

+0

el mapa de bits (imagen, anchura, altura) constructor de "cuantificación del color" hace un trabajo bastante creíble sin mucho alboroto. –

+0

De mala calidad, sin embargo. –

Respuesta

24

imagen cambio de tamaño es la funcionalidad está integrada en el marco .NET. Hay un par de enfoques diferentes:

  • GDI +
  • WIC
  • WPF

Aquí hay un buen blog post que cubre las diferencias entre ellos.

He aquí un ejemplo con GDI +:

public void Resize(string imageFile, string outputFile, double scaleFactor) 
{ 
    using (var srcImage = Image.FromFile(imageFile)) 
    { 
     var newWidth = (int)(srcImage.Width * scaleFactor); 
     var newHeight = (int)(srcImage.Height * scaleFactor); 
     using (var newImage = new Bitmap(newWidth, newHeight)) 
     using (var graphics = Graphics.FromImage(newImage)) 
     { 
      graphics.SmoothingMode = SmoothingMode.AntiAlias; 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      graphics.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight)); 
      newImage.Save(outputFile); 
     } 
    } 
} 
+0

Gracias Darin. No deseo mencionar el ancho y la altura en números. Más bien serán mencionados en porcentajes. Para usar esto tendré que (probablemente) calcular el ancho de altura de las imágenes existentes. – James

+0

Sí, puedes hacer esto luego de cargar 'srcImage'. Entre la primera y la segunda instrucción 'using'. Usted utiliza el uso de srcImage.Width y srcImage.Height para calcular el newWidth y newHeight pasado al constructor del mapa de bits. –

+0

He actualizado mi publicación con un ejemplo. –

7

he usado el ejemplo proporcionado por Darin Dimitrov, La imagen fue inflado a y tomó una gran cantidad de espacio en disco (de 1,5 MB a 17 MB o menos).

Esto se debe a un pequeño error en la última línea de código.

La siguiente función guardará la imagen como mapa de bits (tamaño de imagen enorme).

newImage.Save(outputFile) 

La función correcta debe ser:

newImage.Save(outputFile, ImageFormat.Jpeg); 
Cuestiones relacionadas