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.