Mostrar un PictureBox con forma redondeada en C# y VB

PictureBox sobre el que se dibuja una región de recorte de forma circular con el método GraphicsPath.AddEllipse para obtener una imagen redonda, en C# y VB

Tienes una versión más compleja de este ejercicio aquí.

Clase GraphicsPath

La clase GraphicsPath del espacio de nombres System.Drawing.Drawing2D tiene objetos que representan figuras (líneas y curvas conectadas). Las aplicaciones usan estas secuencias de datos con líneas y curvas (path) para dibujar los bordes o rellenar el interior de las figuras y crear zonas de recorte. El motor gráfico mantiene las coordenadas de las figuras geométricas en objetos path que pueden estar formados a su vez por otras figuras (subpath).

Cada figura se compone de:

  • líneas y curvas
  • figura geométrica

El punto de comienzo de una figura es el primer punto en la secuencia de líneas y curvas conectadas. A efectos de relleno y recorte, todas las figuras aparecen como cerradas, añadiendo una línea del punto final al punto inicial. Algunos miembros de la clase GraphicsPath son:

  • constructor GraphicsPath – inicializa una nueva instancia de la clase GraphicsPath.
  • FillMode – obtiene o configura una enumeración FillMode que determina cómo se rellena el interior de las figuras en el objeto GraphicsPath.
  • PathData – encapsula una matriz de puntos y tipos para el objeto GraphicsPath.
  • AddArc – añade un arco elíptico.
  • AddClosedCurve – añade una curva cerrada.
  • AddCurve – añade una curva.
  • AddEllipse – añade una elipse.
  • AddLine – añade una línea.
  • AddLines – añade una serie de líneas.
  • AddPath – añade un objeto GraphicsPath.
  • AddPolygon – añade un polígono.
  • AddRectangle – añade un rectángulo.
  • AddRectangles – añade una serie de rectángulos.

Es posible dibujar un objeto GraphicsPath con alguno de los métodos listados más arriba o con el método Graphics.DrawPath:

GraphicsPath.AddEllipse(new Rectangle(x, y, ancho, alto));
//
DrawPath (System.Drawing.Pen pen, System.Drawing.Drawing2D.GraphicsPath path);

Parámetros que se pasan al método Graphics.DrawPath:

  • pen: objeto que determina color, anchura y estilo del objeto path (del trazado).
  • path: objeto GraphicsPath que va a ser dibujado.

Código en C#

Importamos los espacios de nombres:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Windows.Forms;

Actuamos en el evento Paint del PictureBox (se consigue el mismo resultado actuando en el evento Paint del Formulario) > Creamos un objeto de la clase GraphicsPath > Usamos el método AddEllipse para conseguir la figura de un círculo que aplicaremos sobre el control PictureBox > En el control PictureBox creamos una región que se corresponde con la figura del objeto GraphicsPath > Manipulando unas variables enteras que se corresponden con los puntos x.y (ancho y alto de la figura) podemos variar su aspecto. Configuramos tanto el tamaño como la posición de la figura en el PictureBox.

//ACTUAMOS EN EL EVENTO PAINT DEL PICTUREBOX
// El evento Paint se produce cada vez que se dibuja el formulario o cualquier otro control
// Aquí se rellena el PictureBox con la imagen elegida recortando sobre ella un círculo
// para crear la ventana del formulario que será copiada de formas diferentes y guardada como archivos JPG
private void PBox1_Paint(object sender, PaintEventArgs e)
{
    // Podemos mejorar el aspecto del borde redondeado aplicando antialias
    // Graphics.SmoothingMode obtiene o establece la calidad de la representación del objeto Graphics
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    // Creamos un objeto de la clase GraphicsPath que representa una serie de líneas y curvas conectadas
    GraphicsPath curra = new GraphicsPath();
    // Manipulando las variables que se corresponden con los puntos x.y, ancho y alto de la figura podemos variar su aspecto
    int x = 0;
    int y = 0;
    int ancho = 0;
    int alto = 0;
    // Posiciones x.y del objeto curra (las del control PictureBox)
    x = PBox1.Left;
    y = PBox1.Top;
    // Anchura y altura del objeto curra, un poco menores que las del PictureBox para que se vea bien ajustado al control
    ancho = PBox1.Width - 24;
    alto = PBox1.Height - 24;
    // Usamos el método AddEllipse para agregar la forma de un círculo o elipse al trazado actual (el control PictureBox)
    curra.AddEllipse(new Rectangle(x, y, ancho, alto));
    // En el PictureBox creamos una región que se corresponde con la forma del objeto GraphicsPath (círculo)
    // y se dibuja en el PictureBox asignando el objeto curra a la región
    // Region de System.Drawing describe el interior de una forma gráfica formada por rectángulos y trazados
    Region reg = default(Region);
    reg = new Region(curra);
    PBox1.Region = reg;
    // Otra forma de realizarlo
    //pBox.Region = New Region(curra)
}

Puedes descargar un archivo ZIP con las aplicaciones C# y en VB.