usar para necesarios library guardar elementos ejemplo dibujar como c# graphics imaging

c# - para - Escalado de un System.Drawing.Bitmap a un tamaño dado manteniendo la relación de aspecto



guardar image c# (3)

El constructor de mapa de bits ha incorporado el cambio de tamaño.

Bitmap original = (Bitmap)Image.FromFile("DSC_0002.jpg"); Bitmap resized = new Bitmap(original,new Size(original.Width/4,original.Height/4)); resized.Save("DSC_0002_thumb.jpg");

http://msdn.microsoft.com/en-us/library/0wh0045z.aspx

Si quieres controlar los modos de interpolación ve esta publicación .

Quiero escalar un System.Drawing.Bitmap al menos a un ancho y altura fijos. Esto es para generar miniaturas para una galería de imágenes en un sitio web, por lo que quiero mantener la relación de aspecto igual.

Tengo algunas a través de bastantes soluciones, pero ninguna parece realmente hacer lo que necesito; giran en torno a la escala basada en mantener el ancho o la altura igual pero sin cambiar ambos.

Un ejemplo:

Si tengo una imagen de 4272 por 2848 y quiero escalarla a un tamaño de 1024 por 768, la imagen resultante debería ser de 1024 por 683 y rellenada (con un borde negro) a 1024 por 768.

¿Cómo puedo hacer esto con imágenes más grandes que el tamaño requerido y más pequeñas que el tamaño requerido y también rellenar las imágenes que no llegan al tamaño exacto que necesito una vez escalado?


Parámetros de destino:

float width = 1024; float height = 768; var brush = new SolidBrush(Color.Black);

Su archivo original:

var image = new Bitmap(file);

Tamaño objetivo (factor de escala):

float scale = Math.Min(width / image.Width, height / image.Height);

El cambio de tamaño incluye lienzo de cepillado primero:

var bmp = new Bitmap((int)width, (int)height); var graph = Graphics.FromImage(bmp); // uncomment for higher quality output //graph.InterpolationMode = InterpolationMode.High; //graph.CompositingQuality = CompositingQuality.HighQuality; //graph.SmoothingMode = SmoothingMode.AntiAlias; var scaleWidth = (int)(image.Width * scale); var scaleHeight = (int)(image.Height * scale); graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); graph.DrawImage(image, ((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight);

Y no olvide hacer un bmp.Save(filename) para guardar el archivo resultante.


Solo para agregar a la respuesta de yaman, que es perfecta para las imágenes, pero no tanto para el texto. Si está tratando de usar esto para escalar texto ... como decir un documento de Word (en este caso, en bytes de interoperabilidad de palabra) necesitará hacer algunas modificaciones o tendrá barras gigantes en el lado. Puede que no sea perfecto pero funciona para mí!

using (MemoryStream ms = new MemoryStream(wordBytes)) { float width = 3840; float height = 2160; var brush = new SolidBrush(Color.White); var rawImage = Image.FromStream(ms); float scale = Math.Min(width / rawImage.Width, height / rawImage.Height); var scaleWidth = (int)(rawImage.Width * scale); var scaleHeight = (int)(rawImage.Height * scale); var scaledBitmap = new Bitmap(scaleWidth, scaleHeight); Graphics graph = Graphics.FromImage(scaledBitmap); graph.InterpolationMode = InterpolationMode.High; graph.CompositingQuality = CompositingQuality.HighQuality; graph.SmoothingMode = SmoothingMode.AntiAlias; graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); graph.DrawImage(rawImage, new Rectangle(0, 0 , scaleWidth, scaleHeight)); scaledBitmap.Save(fileName, ImageFormat.Png); return scaledBitmap; }