0

我正在尝试在图像顶部绘制一个仿射矩形(带有旋转和倾斜),但不知道如何计算顶点。我没有数学或矩阵运算的背景。

我的仿射类定义如下:

public class AffineRectangle
{
public double X { get; set; }
public double Y { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double Rotation { get; set; }
public double Skew { get; set; }
}

我计划使用 ImageSharp 库使用类似于以下的代码绘制多边形:

using (Image<Rgba32> image = new Image<Rgba32>(800, 800))
{
  image.Mutate(x => x.DrawPolygon(
      Rgba32.Red,
      10,
      new SixLabors.Primitives.PointF[] {
          new Vector2(10, 10),
          new Vector2(550, 50),
          etc...
      }));
  image.Save("test.bmp");
}

编辑:这是我正在编写的 dotnet 核心 Web 服务。

4

2 回答 2

1

当前的 API(beta6)将是这样的。

using (var image = new Image<Rgba32>(800, 800))
{
    var builder = new AffineTransformBuilder()
            .AppendSkewDegrees(10F, 5F)
            .AppendRotationDegrees(45F);

    var rectangle = new Rectangle(0, 0, 150, 150);
    var polygon = new RectangularPolygon(rectangle);
    Matrix3x2 matrix = builder.BuildMatrix(rectangle);

    image.Mutate(x => x.Draw(
        Rgba32.Red,
        10,
        polygon.Transform(matrix)));

    image.Save("test.bmp");
}
于 2019-08-14T13:38:53.033 回答
1

线性变换的任何组合都可以组合成一个矩阵并一次性应用。在 System.Windows.Media 命名空间中,您可以使用一些类来为您计算。您需要对 PresentationCore.dll 的引用,如果您正在编写 WPF 应用程序,您可能已经拥有它。

例子:

using System.Windows.Media;

var myPoint = new Point(10, 10);
var transforms = new TransformGroup();
transforms.Children.Add(new RotateTransform(90));
transforms.Children.Add(new SkewTransform(0, 30));
var transformedPoint = transforms.Transform(myPoint);

编辑:对于面向 .NET Core 的项目,您可以参考 System.Drawing.Common 包来实现类似的功能。下面的示例代码:

using System.Drawing;
using System.Drawing.Drawing2D;

var myPoint = new PointF(10, 10);
var transform = new Matrix();
transform.Rotate(90.0f);
transform.Shear(5, 0);
var transformed = new PointF[] { myPoint };
transform.TransformPoints(transformed);
于 2019-08-08T18:48:40.720 回答