Ir al contenido principal

Imagen: Editar, Recortar, Redimencionar y Guardar en Carpeta



 En C #, puede ser agotador para hacer ciertas funciones de edición de imagen utilizando GDI +. Este blog tiene algunos métodos de edición divertidas que pueden ser útiles a veces. También he incluido un bonito y pequeño programa en C # para mostrar toda la funcionalidad de los siguientes métodos.
Guardar un Jpeg dentro de una carpeta.

Lo primero a hacer es configurar la firma del método con los parámetros de entrada. Se trata de la ruta de archivo de salvar (cadena), la imagen de guardar (System.Drawing.Bitmap), y un ajuste de calidad (largo).
private void saveJpeg(string path, Bitamp img, long quality)

Lo proximo a hacer es configurar la información del codificador para guardar el archivo. Esto incluye establecer un EncoderParameter para la calidad de la imagen JPEG. El siguiente paso es obtener la información codec de su equipo para jpegs. Hago esto con una función para recorrer las disponibles en el equipo y asegurarse que el codec jpeg está ahí. La línea de bajo se asegura de que el codec JPEG se encuentra en el equipo. Si no simplemente devuelve fuera del método.

La última cosa a hacer es guardar el mapa de bits utilizando el codec y el infomation encoder.

private void saveJpeg(string path, Bitmap img, long quality)
{
   // Encoder parameter for image quality
   EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);

   // Jpeg image codec
   ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg");

   if(jpegCodec == null)
      return;

   EncoderParameters encoderParams = new EncoderParameters(1);
   encoderParams.Param[0] = qualityParam;

   img.Save(path, jpegCodec, encoderParams);
}

private ImageCodecInfo getEncoderInfo(string mimeType)
{
   // Get image codecs for all image formats
   ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

   // Find the correct image codec
   for (int i = 0; i < codecs.Length; i++)
      if (codecs[i].MimeType == mimeType)
         return codecs[i];
   return null;
}

Recorte

El método toma dos objetos - la imagen que desea recortar (System.Drawing.Image) y el rectángulo para recortar (System.Drawing.Rectangle). La siguiente cosa a hacer es crear un mapa de bits (System.Drawing.Bitmap) de la imagen. Lo único que queda por hacer es recortar la imagen. Esto se hace mediante la clonación de la imagen original, pero sólo teniendo un rectángulo de la original.

private static Image cropImage(Image img, Rectangle cropArea)
{
   Bitmap bmpImage = new Bitmap(img);
   Bitmap bmpCrop = bmpImage.Clone(cropArea,
   bmpImage.PixelFormat);
   return (Image)(bmpCrop);
}

Cambiar el tamaño

El siguiente grupo de código es un poco más largo y más complejo. La razón principal que este código es más largo es porque esta función al cambio de tamaño se mantendrá la altura y la anchura proporcional.
Para empezar, vemos que los parámetros de entrada son la imagen para cambiar el tamaño (System.Drawing.Image) y el tamaño (System.Drawing.Size). También en este conjunto de código hay  algunas variables que utilizamos. Los dos primeros son la altura y anchura original que se utiliza más adelante. Y hay 3 otras variables para calcular la información de proporción.

private static Image resizeImage(Image imgToResize, Size size)
{
   int sourceWidth = imgToResize.Width;
   int sourceHeight = imgToResize.Height;

   float nPercent = 0;
   float nPercentW = 0;
   float nPercentH = 0;
}

El siguiente paso es determinar en realidad el tamaño que debe tener la iamgen. El primer paso es el cálculo de los porcentajes del nuevo tamaño en comparación con el original. A continuación tenemos que decidir qué porcentaje es menor porque este es el porcentaje de la imagen original que utilizaremos en altura y en anchura. Y ahora se calcula el número de píxeles de altura y anchura de la imagen de destino.

nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);

if (nPercentH < nPercentW)
   nPercent = nPercentH;
else
   nPercent = nPercentW;

int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);

La última cosa a hacer es crear el mapa de bits (System.Drawing.Bitmap) que vamos a dibujar. La imagen cambia de tamaño en el uso de un objeto Graphics (System.Drawing.Graphics) del objeto. Asimismo, establecer el modo de interpolación, que es el algoritmo usado para cambiar el tamaño de la imagen. Prefiero HighQualityBicubic, que desde mi prueba parece devolver los resultados más altos de calidad. Y sólo para limpiar un poco que disponer del objeto Graphics.

Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;

g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();

Y esto nos da el código final.

private static Image resizeImage(Image imgToResize, Size size)
{
   int sourceWidth = imgToResize.Width;
   int sourceHeight = imgToResize.Height;

   float nPercent = 0;
   float nPercentW = 0;
   float nPercentH = 0;

   nPercentW = ((float)size.Width / (float)sourceWidth);
   nPercentH = ((float)size.Height / (float)sourceHeight);

   if (nPercentH < nPercentW)
      nPercent = nPercentH;
   else
      nPercent = nPercentW;

   int destWidth = (int)(sourceWidth * nPercent);
   int destHeight = (int)(sourceHeight * nPercent);

   Bitmap b = new Bitmap(destWidth, destHeight);
   Graphics g = Graphics.FromImage((Image)b);
   g.InterpolationMode = InterpolationMode.HighQualityBicubic;

   g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
   g.Dispose();

   return (Image)b;
}



Espero que lo disfruten, compartan y comenten. ;)
Visita: http://rubitcorp.co/
"Si se puede imaginar... se puede programar."

Comentarios

Publicar un comentario

Entradas populares de este blog

Formatos con String.Format en C#

Todas las aplicaciones que desarrollamos en algún momento necesitan formatear algún tipo de datos, y no se a ustedes pero a mi siempre se me olvidan los formatos y como obtener los resultados de una u otra forma, es por eso que decidí hacer este post, y recopilar la mayor cantidad de formatos posibles, para buscarlos cuando necesite y ustedes puedan copiarlos ;=). Para formatear cadenas existe una clase especializada en el manejo de cadenas, esta clase se llama String, su nombre completo es System.String, ya que se encuentra en el namespace System. En esta clase vamos a encontrar una función llamada Format que se encargará de reemplazar el valor de un dato (entero, real, una cadena, un carácter, hasta de un objeto), por el formato que se especifique en el parámetro. En forma general, y aunque tiene varias sobrecargas, String.Format tiene la siguiente sintaxis: Formatos para números:   Tipo ...

Subir archivos al servidor

 Muchas veces necesitamos que nuestros usuarios puedan subir archivos al servidor  ya sean imágenes,pdf, rar,zip,etc, y es común que quieran encontrar métodos fáciles y agiles para realizar esto. Es por eso que hoy les traigo un post donde les enseñare a crear una aplicación en ASP.NEET Y C# para que puedan subir archivos a una carpeta del servidor. Es muy simple, pero vaya que nos es útil, y más cuando es para satisfacer las necesidades de nuestro cliente. Sin hablar más aquí vamos: Lo primero que haremos es crear una aplicación en Visual Studio - ASP.NET y escogeremos como lenguaje C#, luego agregaremos una nueva WebPage y agregaremos los siguientes controles: FileUpload – Label - Boton Le cambiaremos los id de los controles  y les pondremos nombres descriptivos por aquello de las Buenas practicas de programación. La propiedad Text del botón le pondremos “Enviar”. Crearemos una carpeta en el server que se llame “Archivos” para esto daremos Click derecho en el e...

Hora Militar o Formato 24 Horas en SQL SERVER

Es curioso los problemas que nos encontramos a diario al desarrollar, siempre resulta que hay algo nuevo y algo que no sabemos, aprendemos día a día con cada cosa que hacemos, y cada código que escribimos. El día de hoy les traigo una instrucción que si bien es muy sencilla, puede ahorrarnos varias horas de búsqueda infructuosa en san google. Se trata de convertir una hora en sql server al formato militar o formato de 24 horas. Para esto tenemos varias formas: SELECT CONVERT(VARCHAR(8), dateadd(HOUR,12, cast('2017-01-01 10:15:00' as datetime)), 108) AS HoraMilitar Veamos lo que se hace en la instrucción anterior: Tenemos la fecha y hora: 2017-01-01 10:15:00 la cual convertimos a datetime cast('2017-01-01 10:15:00' as datetime) luego le sumamos 12 horas para ejemplificar el ejercicio "dateadd(HOUR,12," y por ultimo pasamos a varchar para darle formato militar CONVERT(VARCHAR(8), "Aquí la fecha",108) Notese que uso el código 108 de con...