我有大量的svg格式符号,需要在Win2D的Canvas绘制会话中进行绘制。其中许多都会重复,因此我打算将它们预先加载到库中。似乎有不同的方法可以做到这一点。其中一个是CanvasSvgDocument,我可以使用其LoadAsync方法从Uri加载它,并使用DrawingSession方法DrawSvg及其替代方法进行绘制。麻烦的是,DrawSvg会忽略size参数,并始终以相同的大小绘制图像。例如,在绘图会话中:
float2 symbolSize;
symbolSize.x = 400;//just to experiment
symbolSize.y = 300;
session.DrawSvg(m_test_svg, symbolSize, 100, 100);
无论symbolSize大小如何,图像始终以相同的小尺寸呈现。 size参数有什么不对劲,还是我误会了它的用途?无论如何,这也许不是绘制Svg的最佳方法。这些都是可缩放的视图,在任何放大倍数下都需要清晰地绘制。
[更新]我注意到我的size参数类型错误,应该是
winrt::Windows::Foundation::Size symbolSize;
symbolSize.Width = 400;
symbolSize.Height = 300;
session.DrawSvg(m_test_svg, symbolSize,100,100);
但是结果是相同的,这也许就是为什么编译器接受两者的原因。 也就是说,我希望Size类型为Float2。但是它不应该影响绘图吗?
[更新]文档说Size参数是指视口大小,而不是视盒大小。如果某个参与创建此类的人可以描述此调用中Size参数的用途,也许就足够了;如果它不是要确定渲染图像的大小,是否还有其他方法可以做到这一点?谢谢。 [更新]更具体地说,在进一步研究之后:缩放此可缩放矢量图像需要更改视图框,而DrawSvg的参数显然仅影响viewPort,即要渲染的图像部分。有什么方法可以放大或缩小图像?如果没有,我不妨使用png。如果您无法缩放svg,那么意义何在?
[更新]仍希望对此有所反馈。我在其他地方听说过,在绘制数百个符号之前,可以更改整个画布的变换。还没有想出如何做,但是另一个想法出现了:CanvasSvgAspectScaling枚举似乎包含了一些相关的内容:具有适当值的PreserveAspectRatio意味着“将视图框放大到使整个视图框可见所需的最大值”在视口中。”听起来这意味着:设置视口为所需图像的大小,将CanvasSvgAspectScaling设置为具有该枚举值,然后svg将绘制以填充视口,这是CanvasDrawingSession.DrawSvg中提供的参数。那样很好,但是没有效果。
答案 0 :(得分:0)
好的,这就是答案。据我所知,完全没有记录在案,所以我希望它是稳定的。如果是这样,我确实应该将其设为商业秘密,但我感到公众有灵感。看来,如果我只是删除svg的Height和Width属性,那么DrawingSession.DrawSvg中的视口大小参数将成为绘制图像的大小-任意比例,无需在任何地方设置变换。 Viewbox和Viewport成为一体。很简单的。如果MS上有人知道我不应该这样做的原因,请讲话!