SVG WPF C#渲染问题

时间:2015-01-02 12:09:34

标签: wpf svg rendering

从SVG渲染库1.7.0(使用NuGet安装)开始,我遇到了一个对我没有意义的问题。使用最简单的SVG内容(带有清晰可辨的黑色边框的填充矩形):

<svg  xmlns="http://www.w3.org/2000/svg"
      xmlns:xlink="http://www.w3.org/1999/xlink">
    <rect x="0" y="0" height="50" width="50"
          style="stroke:#000000; fill: #efefef"/>
</svg>

然后我继续使用位图和图片框加载并显示它:

        String path = Path.Combine(
            AppDomain.CurrentDomain.BaseDirectory,
            "etc\\simple.svg");

        var svgDocument = SvgDocument.Open(path);
        bitmap = new Bitmap(50, 50, PixelFormat.Format32bppArgb);
        svgDocument.Draw(bitmap);
        var ms = new MemoryStream();
        bitmap.Save(ms, ImageFormat.Png);
        ms.Position = 0;

        var bi = new BitmapImage();
        bi.BeginInit();
        bi.StreamSource = ms;
        bi.EndInit();

        img.Source = bi;

因此,将50 x 50矩形渲染到50 x 50位图应该会渲染出一个非缩放的完整图像,其中包含一个由黑色边框包围的灰色方块。然而,发生的是边界的顶部和左侧被切断。

从概念上讲,我显然缺少一些东西,比如使用位图大小,查看端口和 缩放给我混合的结果,一两个工作,但没有任何理解。

这是修改后的来源,经过测试 - 感谢Robert的建议:             bitmap = new Bitmap(51,51,PixelFormat.Format32bppArgb);

        svgDocument.Transforms.Add(new SvgTranslate(.5f, .5f));
        svgDocument.Draw(bitmap);

谢谢, 加维

1 个答案:

答案 0 :(得分:2)

在边缘内部绘制1/2并且在边缘外部绘制1/2,因此您绘制的笔划在边缘处被部分切除,因为您的形状实际上是1/2(左边缘笔划)+ 50 + 1/2 (右边缘行程)= 51个单位宽,同样也是51个单位高。

你可以将矩形定位在0.5,0.5并使其变小或使位图变大以完全显示它。

SVG规范说

‘stroke’属性沿着给定图形元素的轮廓绘制。