从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);
谢谢, 加维
答案 0 :(得分:2)
在边缘内部绘制1/2并且在边缘外部绘制1/2,因此您绘制的笔划在边缘处被部分切除,因为您的形状实际上是1/2(左边缘笔划)+ 50 + 1/2 (右边缘行程)= 51个单位宽,同样也是51个单位高。
你可以将矩形定位在0.5,0.5并使其变小或使位图变大以完全显示它。
SVG规范说
‘stroke’属性沿着给定图形元素的轮廓绘制。