Como girar, refletir e distorcer imagens

Você pode girar, refletir e distorcer uma imagem especificando pontos de destino para os cantos superior esquerdo, superior direito e inferior esquerdo da imagem original. Os três pontos de destino determinam uma transformação afim que mapeia a imagem retangular original para um paralelogramo.

Exemplo

Por exemplo, suponha que a imagem original é um retângulo com o canto superior esquerdo em (0, 0), o canto superior direito em (100, 0) e o canto inferior esquerdo em (0, 50). Agora suponha que você mapeie os três pontos para pontos de destino da seguinte maneira.

Ponto original Ponto de destino
Superior esquerdo (0, 0) (200, 20)
Superior direito (100, 0) (110, 100)
Inferior esquerdo (0, 50) (250, 30)

A ilustração a seguir mostra a imagem original e a imagem mapeada para o paralelogramo. A imagem original foi distorcida, refletida, girada e movida. O eixo x ao longo da borda superior da imagem original é mapeado para a linha que percorre (200, 20) e (110, 100). O eixo y ao longo da borda esquerda da imagem original é mapeado para a linha que percorre (200, 20) e (250, 30).

The original image and the image mapped to the parallelogram.

A ilustração a seguir mostra uma transformação semelhante aplicada a uma imagem fotográfica:

The picture of a climber and the picture mapped to the parallelogram.

A ilustração a seguir mostra uma transformação semelhante aplicada a um metarquivo:

Illustration of shapes and text and that mapped to the parallelogram.

O exemplo a seguir produz as imagens mostradas na primeira ilustração.

    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);
' 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 As 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)

Compilando o código

O exemplo anterior foi projetado para uso com o Paint Windows Forms e requer PaintEventArgse, que é um parâmetro do manipulador de eventos. Substitua Stripes.bmp pelo caminho até uma imagem válida no seu sistema.

Confira também