Recortar una imagen en C#
-
Utilice el método
Graphics.DrawImage()
para dibujar y recortar una imagen enC#
-
Utilice
DrawImage()
con cinco parámetros para recortar una imagen enC#
-
Use
DrawImage()
con una porción, ubicación y tamaño especificados para recortar una imagen enC#
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 porsrcRect
.
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:
- Se creó una imagen a partir de un archivo JPEG
Koala.jpg
ubicado en la carpetaC:\Users\lolaa\Downloads
. - Se crearon las coordenadas para dibujar la imagen.
- Se creó un rectángulo de origen para extraer una parte de la imagen.
- La unidad de medida se estableció en píxeles.
- 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:
Al hacer clic en el botón, se muestra la siguiente imagen:
Producción:
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:
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
ysrcY
- las coordenadas x e y de la esquina superior izquierda de la imagen.srcWidth
ysrcHeight
: especifique el ancho y el alto de la imagen, respectivamente.srcUnit
- pertenece a la enumeraciónGraphicsUnit
. Son las unidades de medida que utiliza el parámetrosrcRect
.imageAttrs
: una instancia deImageAttributes
que especifica información de cambio de color y gamma para objetos de imagen.devolución de llamada
- una función delegada deGraphics.DrawImageAbort
. Especifica la sobrecargaDrawImage()
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 delegadoGraphics.DrawImageAbort
los use al verificar si se detiene la ejecución del métodoDrawImage
.
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:
- Se creó una instancia del método de devolución de llamada
Graphics.DrawImageAbort
. - Se creó una imagen
Koala.jpg
ubicada en la carpetaC:\Users\lolaa\Downloads
. - Se crearon puntos para el rectángulo de destino para dibujar la imagen.
- Se creó un contenedor rectangular para especificar la parte de la imagen que se dibujará.
- La unidad de dibujo de gráficos se configuró en píxeles.
- La imagen original fue dibujada en la pantalla.
- Un contenedor rectangular adicional para dibujar una imagen ajustada.
- Establece los atributos de la imagen ajustada a un valor gamma mayor.
- 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:
Más información sobre otros métodos DrawImage()
sobrecargados está disponible en [esta referencia]).