将几何图形绘制到位图上 (Avalonia)

Drawing a geometry onto a Bitmap (Avalonia)

我的问题很直接:是否可以将 Avalonia.Media.Geometry 绘制到 Avalonia.Media.Bitmap 上,这样我就可以将生成的图像保存到 Steam 中并使用整个图像ImageBrush?

System.Drawing 命名空间中,可以简单地调用 Graphics.FromImage(mySystemDrawingBitmap); 来获得一个 Graphics 对象,然后可以用它来绘制任何你想要的几何图形。

在 Avalonia 中是否有类似的简单方法?我从 documentation 中挖出了一个叫做 RenderTargetBitmap 的东西,它看起来很有前途,因为它有一个叫做 CreateDrawingContext 的方法,但它显然需要一个 IVisualBrushRenderer (不管是什么)实例作为工作的参数。似乎有一个叫做 ImmediateRenderer 的东西实现了上述接口,但是它需要一个 Avalonia.VisualTree.IVisual 本身作为其构造函数中的参数,在这个阶段我有点怀疑 RenderTargetBitmap 的用处对于我的问题,因为它似乎有大量我并不真正想要或不需要的随机需要的对象实例的开销,而且我不会创建一个虚拟 IVisual 实例只是为了在位图上绘制一些东西。这只是有一种可怕的代码气味。

Sooo:将 Avalonia.Media.Geometry(例如使用 Geometry.Parse() 创建)渲染到 Avalonia.Media.Bitmap 上。你实际上应该怎么做?

void RenderToFile(Geometry geometry, Brush brush, string path)
{
    var control = new DrawingPresenter()
    {
        Drawing = new GeometryDrawing
        {
            Geometry = geometry, Brush = brush,
        },
        Width = geometry.Bounds.Right,
        Height = geometry.Bounds.Bottom
    };

    RenderToFile(control, path);
}

void RenderToFile(Control target, string path)
{
    var pixelSize = new PixelSize((int) target.Width, (int) target.Height);
    var size = new Size(target.Width, target.Height);
    using (RenderTargetBitmap bitmap = new RenderTargetBitmap(pixelSize, new Vector(96, 96)))
    {
        target.Measure(size);
        target.Arrange(new Rect(size));
        bitmap.Render(target);
        bitmap.Save(path);
    }
}