Поделиться через


Практическое руководство. Поворот, отражение и отклонение изображений

Вы можете повернуть, отразить и изменить изображение, указав точки назначения для верхнего левого, правого верхнего и нижнего левого углов исходного изображения. Три конечных точки определяют аффинное преобразование, которое сопоставляет исходное прямоугольное изображение с параллелограммой.

Пример

Например, предположим, что исходное изображение — прямоугольник с левым верхним углом (0, 0), правым верхним углом (100, 0) и нижним левым углом (0, 50). Допустим, эти три точки отображаются в соответствующие точки назначения указанным ниже образом.

Исходная точка Точка назначения
Верхний левый (0, 0) (200, 20)
Верхний правый (100, 0) (110, 100)
Слева внизу (0, 50) (250, 30)

На следующем рисунке показан исходный образ и изображение, сопоставленное с параллелограммой. Исходное изображение было отклонено, отражено, вращено и переведено. Ось x вдоль верхнего края исходного изображения сопоставляется со строкой, которая проходит через (200, 20) и (110, 100). Ось Y вдоль левого края исходного изображения сопоставляется с линией, которая проходит через (200, 20) и (250, 30).

Исходное изображение и изображение, сопоставленные с параллелограммой.

На приведенном ниже рисунке показано такое же преобразование, примененное к фотографическому изображению.

Изображение альпиниста и рисунка, сопоставленного с параллелограммой.

На следующем рисунке показано аналогичное преобразование, примененное к метафайлу.

Иллюстрация фигур и текста, сопоставленных с параллелограммой.

В следующем примере создаются изображения, показанные на первом рисунке.

    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)

Компиляция кода

Приведенный выше пример предназначен для использования с Windows Forms и требует PaintEventArgse, который является параметром обработчика событий Paint. Замените Stripes.bmp на путь к изображению, имеющемуся в системе.

См. также