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

Guía completa de .NET MAUI para el desarrollo de aplicaciones móviles multiplataforma

Guía completa de .NET MAUI para el desarrollo de aplicaciones móviles multiplataforma ⏱️ Tiempo de lectura: 30 minutos 🎯 Nivel: Intermedio ¡Prepárate para revolucionar el desarrollo móvil! Descubre .NET MAUI, el marco multiplataforma que te permite crear aplicaciones nativas para iOS, Android y escritorio con una sola base de código. Adéntrate en los fundamentos, implementaciones prácticas, ejemplos avanzados y mejores prácticas para dominar .NET MAUI y llevar tus habilidades de desarrollo móvil al siguiente nivel. 📑 Contenido del Artículo Introducción a .NET MAUI para móviles Fundamentos y Conceptos Clave Arquitectura de .NET MAUI ...

Eventos de una Página Web (WebForm ASP.NET)

Este pequeño post es para aclarar algunos conceptos sobre el ciclo de vida de una página web ASP.NET (WebForm). Nota: A este post le iré agregando mas contenido poco a poco, con los propios comentarios de los lectores y mis experiencias diarias sobre el ciclo de vida y los distintos estados de una pagina. Eventos más importantes de la pagina en orden de ejecución:     PreInit     Init     Load     PreRender PreInit El evento PreInit ocurre antes de la inicialización de los controles de la pagina. Normalmente es usado para añadir dinámicamente controles a la pagina, porque añadiéndolos aquí garantizamos que a dichos controles se les apliquen adecuadamente los Skins del Theme definido (si no hemos definido ningún Theme daría un poco igual añadirlos aquí o en Init, por ejemplo). Además puede usarse para definir dinámicamente (programáticamente) la MasterPage y el Theme de la pagina. Init Este evento ocurre de...

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 ...