Recortar una imagen en C#

Abdullahi Salawudeen 15 febrero 2024
  1. Utilice el método Graphics.DrawImage() para dibujar y recortar una imagen en C#
  2. Utilice DrawImage() con cinco parámetros para recortar una imagen en C#
  3. Use DrawImage() con una porción, ubicación y tamaño especificados para recortar una imagen en C#
Recortar una imagen en C#

Este artículo presentará cómo dibujar y recortar una imagen específica en una ubicación específica con el tamaño original usando un código C#.

Utilice el método Graphics.DrawImage() para dibujar y recortar una imagen en C#

Los gráficos se pueden encontrar en el espacio de nombres System.Drawing y se utilizan principalmente para mostrar o dibujar gráficos o imágenes en aplicaciones de Windows basadas en .Net. .Net proporciona múltiples clases para tratar con objetos gráficos y formas como bolígrafos, pinceles, rectángulos, círculos, etc.

Las clases Graphics e Image .Net pueden representar una imagen en un Windows Form. La función DrawImage() dibuja una parte de una imagen en una ubicación específica.

A continuación se muestra un fragmento de código para la función DrawImage.

public void DrawImage(System.Drawing.Image image, float x, float y,
                      System.Drawing.RectangleF srcRect, System.Drawing.GraphicsUnit srcUnit);

Los parámetros se explican a continuación:

  • imagen - especifica la imagen a dibujar.
  • x - especifica la coordenada x de la imagen.
  • y - especifica la coordenada y de la imagen.
  • srcRect - una estructura RectangleF que especifica la porción de la imagen a dibujar.
  • srcUnit: un miembro de la enumeración GraphicsUnit que especifica las unidades de medida utilizadas por srcRect.

El siguiente ejemplo de código se implementa utilizando Windows Forms y el controlador de eventos Paint con PaintEventArgs e como parámetro.

A continuación se enumeran las acciones realizadas:

  1. Se creó una imagen a partir de un archivo JPEG Koala.jpg ubicado en la carpeta C:\Users\lolaa\Downloads.
  2. Se crearon las coordenadas para dibujar la imagen.
  3. Se creó un rectángulo de origen para extraer una parte de la imagen.
  4. La unidad de medida se estableció en píxeles.
  5. La imagen fue dibujada en la pantalla.

El tamaño del rectángulo de origen especificado determinaba la parte de la imagen original sin escala dibujada en la pantalla.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreatingImageObject {
  public partial class Form1 : Form {
    Image img = null;
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      if (img == null) {
        img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
      }
    }

    private void Form1_Paint(object sender, PaintEventArgs e) {
      if (img != null) {
        // Graphics g = e.Graphics;
        Graphics g = this.CreateGraphics();
        g.DrawImage(img, 0, 0, this.Width, this.Height);

        g.Dispose();
      }
    }
  }
}

Producción:

Página de inicio de la aplicación

Al hacer clic en el botón, se muestra la siguiente imagen:

Producción:

Imagen - Koala dibujado en la pantalla

Rectangle cropRect = new Rectangle(...);
Bitmap src = Image.FromFile(fileName) as Bitmap;
Bitmap target = new Bitmap(cropRect.Width, cropRect.Height);

using (Graphics g = Graphics.FromImage(target)) {
  g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel);
}

Utilice DrawImage() con cinco parámetros para recortar una imagen en C#

Para editar o recortar la imagen que dibujamos anteriormente, podemos usar la función DrawImage(Image, Single, Single, RectangleF, GraphicsUnit). Puede ver aquí que usamos cinco parámetros dentro de la función.

Actualizar el código anterior daría un resultado diferente. A continuación se muestra el ejemplo de código actualizado.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreatingImageObject {
  public partial class Form1 : Form {
    Image img = null;
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      if (img == null) {
        // Create image.
        img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
      }
    }

    private void Form1_Paint(object sender, PaintEventArgs e) {
      if (img != null) {
        Graphics g = this.CreateGraphics();

        // specify the coordinates for upper-left corner of image.
        float x = 100.0F;
        float y = 100.0F;

        // rectangle is created for the source image with custom dimensions.
        RectangleF srcRect = new RectangleF(50.0F, 50.0F, 150.0F, 150.0F);
        GraphicsUnit dim = GraphicsUnit.Pixel;

        // image is drawn to the screen.
        g.DrawImage(img, x, y, srcRect, dim);
        g.Dispose();
      }
    }
  }
}

Producción:

Imagen - Imagen recortada de Koala

Use DrawImage() con una porción, ubicación y tamaño especificados para recortar una imagen en C#

También podemos usar la función DrawImage() para dibujar una parte específica de la imagen seleccionada en la ubicación especificada y con el tamaño especificado.

Sintaxis:

public void DrawImage(System.Drawing.Image image, System.Drawing.Rectangle destRect, float srcX,
                      float srcY, float srcWidth, float srcHeight,
                      System.Drawing.GraphicsUnit srcUnit,
                      System.Drawing.Imaging.ImageAttributes? imageAttrs,
                      System.Drawing.Graphics.DrawImageAbort? callback, IntPtr callbackData);

Actualizar el código anterior daría un resultado diferente. A continuación se muestra el ejemplo de código actualizado.

Los parámetros se explican a continuación:

  • imagen - especifica la imagen a dibujar.
  • destRect: especifica la ubicación y el tamaño de la imagen en la pantalla. Escala la imagen dibujada para que se ajuste al rectángulo.
  • srcX y srcY - las coordenadas x e y de la esquina superior izquierda de la imagen.
  • srcWidth y srcHeight: especifique el ancho y el alto de la imagen, respectivamente.
  • srcUnit - pertenece a la enumeración GraphicsUnit. Son las unidades de medida que utiliza el parámetro srcRect.
  • imageAttrs: una instancia de ImageAttributes que especifica información de cambio de color y gamma para objetos de imagen.
  • devolución de llamada - una función delegada de Graphics.DrawImageAbort. Especifica la sobrecarga DrawImage() para llamar al dibujar la imagen. La especificación de la aplicación determina el número de veces que se llamará a este método.
  • callbackData: un valor especifica datos adicionales para que el delegado Graphics.DrawImageAbort los use al verificar si se detiene la ejecución del método DrawImage.

El ejemplo de código a continuación también se implementó utilizando Windows Forms y el controlador de eventos Paint con PaintEventArgs e como parámetro.

El código realiza las siguientes acciones:

  1. Se creó una instancia del método de devolución de llamada Graphics.DrawImageAbort.
  2. Se creó una imagen Koala.jpg ubicada en la carpeta C:\Users\lolaa\Downloads.
  3. Se crearon puntos para el rectángulo de destino para dibujar la imagen.
  4. Se creó un contenedor rectangular para especificar la parte de la imagen que se dibujará.
  5. La unidad de dibujo de gráficos se configuró en píxeles.
  6. La imagen original fue dibujada en la pantalla.
  7. Un contenedor rectangular adicional para dibujar una imagen ajustada.
  8. Establece los atributos de la imagen ajustada a un valor gamma mayor.
  9. La imagen ajustada se dibujó en la pantalla.

La devolución de llamada Graphics.DrawImageAbort devuelve un bool que determina la ejecución del método DrawImage.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreatingImageObject {
  public partial class Form1 : Form {
    Image img = null;
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    // Define DrawImageAbort callback method.
    private bool DrawImageCallback8(IntPtr callBackData) {
      // Test for call that passes callBackData parameter.
      if (callBackData == IntPtr.Zero) {
        // If no callBackData passed, abort the DrawImage method.
        return true;
      } else {
        // If callBackData passed, continue DrawImage method.
        return false;
      }
    }
    private void button1_Click(object sender, EventArgs e) {
      if (img == null) {
        // Create image.
        img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
      }
    }

    private void Form1_Paint(object sender, PaintEventArgs e) {
      if (img != null) {
        Graphics g = this.CreateGraphics();

        // Create a call-back method.
        Graphics.DrawImageAbort imageCallback = new Graphics.DrawImageAbort(DrawImageCallback8);
        IntPtr imageCallbackData = new IntPtr(1);

        // Create image.
        // Image newImage = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
        // img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");

        // rectangle for the original image.
        Rectangle destRectOriginal = new Rectangle(100, 25, 450, 150);

        // coordinates of the rectangle.
        float x = 50.0F;
        float y = 50.0F;
        float width = 150.0F;
        float height = 150.0F;
        GraphicsUnit dim = GraphicsUnit.Pixel;

        // Draw original image to screen.
        g.DrawImage(img, destRectOriginal, x, y, width, height, dim);

        // rectangle for the adjusted image.
        Rectangle destRectAdjusted = new Rectangle(100, 175, 450, 150);

        // image attributes and sets gamma.
        ImageAttributes imageAttribute = new ImageAttributes();
        imageAttribute.SetGamma(4.0F);

        // Draw adjusted image to screen.
        try {
          checked {
            // Draw adjusted image to screen.
            g.DrawImage(img, destRectAdjusted, x, y, width, height, dim, imageAttribute,
                        imageCallback, imageCallbackData);
          }
        } catch (Exception ex) {
          g.DrawString(ex.ToString(), new Font("Arial", 8), Brushes.Black, new PointF(0, 0));
        }
      }
    }
    public void DrawImageRect4FloatAttribAbortData(PaintEventArgs e) {}
  }
}

Producción:

Imagen - Imagen original y editada de Koala

Más información sobre otros métodos DrawImage() sobrecargados está disponible en [esta referencia]).

Abdullahi Salawudeen avatar Abdullahi Salawudeen avatar

Abdullahi is a full-stack developer and technical writer with over 5 years of experience designing and implementing enterprise applications. He loves taking on new challenges and believes conceptual programming theories should be implemented in reality.

LinkedIn GitHub

Artículo relacionado - Csharp Image