在位图上绘制几何图形 (Avalonia)

问题描述

我的问题很简单:是否可以将 Avalonia.Media.Geometry 绘制到 Avalonia.Media.Bitmap 上,以便我可以将生成的图像保存到 Steam 并使用 {{ 1}}?

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

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

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

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...