如何:旋转、反射和扭曲图像

通过指定原始图像的左上角、右上角和左下角的目标点可旋转、反射和扭曲图像。 这三个目标点确定将原始矩形图像映射为平行四边形的仿射变换。

示例

例如,假设原始图像是一个矩形,其左上角、右上角和左下角分别位于 (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) 的直线。

带区

下面的插图显示应用到照片图像的类似变换。

已转换的 Climber

下面的插图显示应用到图元文件的类似变换。

已转换的元文件

下面的示例生成第一个插图中所显示的图像。

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

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

编译代码

前面的示例是为使用 Windows 窗体而设计的,它需要 Paint 事件处理程序的参数 PaintEventArgs e。 请确保用系统上有效的图像路径替换 Stripes.bmp。

请参见

其他资源

使用图像、位图、图标和图元文件