0

我有大量 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 参数是指视口大小,而不是 viewbox 大小。如果参与创建此类的人可以在此调用中描述 Size 参数的目的,也许就足够了 - 如果它不打算确定渲染图像的大小,是否有其他方法可以做到这一点?谢谢。[更新]更具体地说,在进一步研究后:缩放此可缩放矢量图像需要更改视框,而 DrawSvg 的参数显然仅影响视口,即要渲染的图像部分。有没有办法将图像放大或缩小?如果没有,我还不如使用 pngs。如果您无法缩放 svg,那有什么意义呢?

[更新] 仍然希望对此提供反馈。我在其他地方听说过,可以在绘制数百个符号中的任何一个之前更改整个画布的变换。还没有想出如何做到这一点,但出现了另一个想法:CanvasSvgAspectScaling 枚举似乎包含一些相关的内容:具有适当值的 PreserveAspectRatio 意味着“将视图框缩放到使整个视图框可见所需的最大值在视口中。” 听起来这意味着:将视口设置为所需图像的大小,将 CanvasSvgAspectScaling 设置为具有该枚举值,然后 svg 将绘制以填充视口,这是 CanvasDrawingSession.DrawSvg 中提供的参数。这会很好,但它没有效果。

4

1 回答 1

1

好的,这就是答案。据我所知,完全没有记录,所以我希望它是稳定的。如果是这样,我真的应该把它作为商业秘密,但我觉得自己是公益的。看来,如果我只是删除 svg 的 Height 和 Width 属性,那么 DrawingSession.DrawSvg 中的视口大小参数将成为绘制图像的大小 - 无论您想要什么比例,都无需在任何地方设置变换。Viewbox 和 Viewport 合二为一。很简单。如果 MS 有人知道我不应该这样做的原因,请说!

于 2018-11-10T19:56:53.103 回答