问题描述
我的问题很简单:是否可以将 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);
}
}