Compartir a través de


Rotar, reflejar y sesgar imágenes

Las imágenes se pueden rotar, reflejar y sesgar especificando puntos de destino para las esquinas superior izquierda, superior derecha e inferior izquierda de la imagen original. Los tres puntos de destino determinan una transformación afín que asigna la imagen rectangular original a un paralelogramo.

Por ejemplo, supongamos que la imagen original es un rectángulo con la esquina superior izquierda en (0, 0), la esquina superior derecha en (100, 0) y la esquina inferior izquierda en (0, 50). Supongamos ahora que asignamos esos tres puntos a puntos de destino de la siguiente manera:

Punto original Punto de destino
Superior izquierdo (0, 0) (200, 20)
Superior derecho (100, 0) (110, 100)
Inferior izquierdo (0, 50) (250, 30)

En la ilustración siguiente se muestran la imagen original y la imagen asignada al paralelogramo. La imagen original se ha sesgado, reflejado, rotado y trasladado. El eje x situado a lo largo del borde superior de la imagen original se asigna a la línea que va de (200, 20) a (110, 100). El eje y situado a lo largo del borde izquierdo de la imagen original se asigna a la línea que va de (200, 20) a (250, 30).

En el ejemplo siguiente se producen las imágenes mostradas en la ilustración anterior.

' New Point(200, 20)  = destination for upper-left point of original
' New Point(110, 100) = destination for upper-right point of original
' New Point(250, 30)  = destination for lower-left point of original
Dim destinationPoints As Point() =  { _
   New Point(200, 20), _
   New Point(110, 100), _
   New Point(250, 30)}

Dim image = New Bitmap("Stripes.bmp")

' Draw the image unaltered with its upper-left corner at (0, 0).
e.Graphics.DrawImage(image, 0, 0)

' Draw the image mapped to the parallelogram.
e.Graphics.DrawImage(image, destinationPoints)
[C#]
Point[] destinationPoints = {
   new Point(200, 20),   // destination for upper-left point of 
                         // original
   new Point(110, 100),  // destination for upper-right point of 
                         // original
   new Point(250, 30)};  // destination for lower-left point of 
                         // original

Image image = new Bitmap("Stripes.bmp");

// Draw the image unaltered with its upper-left corner at (0, 0).
e.Graphics.DrawImage(image, 0, 0);

// Draw the image mapped to the parallelogram.
e.Graphics.DrawImage(image, destinationPoints);

La siguiente ilustración muestra una transformación similar aplicada a una imagen fotográfica.

La siguiente ilustración muestra una transformación similar aplicada a un metarchivo.