2009-03-26 38 views
8

Tengo imágenes muy grandes (jpg) y quiero escribir un programa CSharp colocar a través de los archivos y reducir el tamaño de cada imagen en un 75%.Crear miniaturas y reducir el tamaño de la imagen

yo probamos este:

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

pero el tamaño del archivo es todavía muy grande.

¿Hay alguna forma de crear imágenes en miniatura y tienen el tamaño del archivo sea mucho más pequeño?

+0

¿Qué tamaño está pasando, es decir, cuáles son los valores de ancho y alto? – dirkgently

+0

estoy creando archivos que son 800 x 600 – leora

Respuesta

18
private void CompressAndSaveImage(Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

private static ImageCodecInfo GetCodecInfo(string mimeType) { 
    foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders()) 
     if (encoder.MimeType == mimeType) 
      return encoder; 
    throw new ArgumentOutOfRangeException(
     string.Format("'{0}' not supported", mimeType)); 
} 

Uso:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10); 

que se comprima Test.jpg con una calidad de 10 y guardarlo como Test2.jpg.

EDIT: podría ser mejor como un método de extensión:

private static void SaveCompressed(this Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

Uso:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
myImg.SaveCompressed(@"C:\Test2.jpg", 10); 
+0

puede tener esta función devolver un tipo de imagen, ya que necesito mantener una cierta interfaz – leora

+0

La compresión tiene lugar cuando se guarda el archivo. Todavía puede usar su código GetThumbnailImage, pero en lugar de llamar a Image.Save, debe llamar a Image.SaveCompressed. AKAIK, no puede comprimir un objeto Imagen directamente y luego devolverlo. –

+0

No necesita guardar en un archivo, ya que puede guardarlo en una secuencia de memoria y volver a crear el mapa de bits a partir de la secuencia de memoria, descartando la secuencia posteriormente. De esta manera, puede devolver la 'Imagen' mientras reduce su tamaño. –

0

comprimir su imagen. Para las miniaturas, JPEG es suficiente, ya que no estás buscando calidad.

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

thumbNail.Save(fileName, ImageFormat.Jpeg); 
0

De la documentación GetThumbnailImage 's:

si la imagen contiene un objeto incrustado imagen en miniatura, este método recupera la miniatura incrustada y la escala el tamaño solicitado. Si la imagen no contiene una imagen en miniatura incrustada, este método crea una imagen en miniatura escalando la imagen principal.

Le sugiero que utilice valores de ancho y alto más pequeños. Proveedores:

// reduce the size of each image by 75% from original 800x600 
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero); 

Ver sample código.

Lea también la documentación:

El método GetThumbnailImage funciona bien cuando la imagen en miniatura requerida tiene un tamaño de aproximadamente 120 x 120 píxeles. Si solicita una imagen en miniatura grande (por ejemplo, 300 x 300) de una Imagen que tiene una miniatura incrustada, puede haber una pérdida notable de calidad en la imagen en miniatura. Podría ser mejor escalar la imagen principal (en lugar de escalar la miniatura incrustada) llamando al método DrawImage.

Creo que es posible que desee echar un vistazo a la API de escala.

2

ImageMagick es una herramienta de línea de comandos que es muy poderosa para hacer la manipulación de imágenes. Lo he usado para cambiar el tamaño de imágenes grandes y la creación de miniaturas en circunstancias en las que la relación de aspecto de la imagen original es desconocida o no es confiable. ImageMagick es capaz de cambiar el tamaño de las imágenes a una altura o ancho específico, manteniendo la relación de aspecto original de la imagen. También puede agregar espacio alrededor de una imagen si es necesario. Con todo, una abstracción muy poderosa y agradable de tener que lidiar con .nets Image APIs.Para utilizar la herramienta de línea de comandos Imagemagick desde dentro de C# le recomiendo usar el objeto System.Diagnostics.ProcessStartInfo así:

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe"; 
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardError = true; 
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation); 

Process p = new Process(); 
p.StartInfo = psi; 
p.Start(); 
p.WaitForExit(); 

Usando la escala% parámetro de puede reducir fácilmente el tamaño de la imagen en un 75%

Cuestiones relacionadas