1

我意识到这是一个非常具体的问题,但我对 SVG 和 Telerik 的了解有限,所以就这样吧。

我正在尝试将 RadHtmlChart 转换为 C# 中的图像。首先要获得图表的 svg,我使用内置的 Telerik 函数。

var chartRendering = $find("<%=BarChart.ClientID %>").getSVGString();

在服务器上拥有该字符串后,我会尝试将其转换为表示图像的内存流。为此,我正在使用https://github.com/vvvv/SVG

   XmlDocument xml = new XmlDocument();
   xml.LoadXml(svgText);
   SvgDocument svg = SvgDocument.Open(xml);

    // Convert SVG document containing image to Stream
   MemoryStream imageStream = new MemoryStream();
   svg.Draw().Save(imageStream, ImageFormat.Png);

最后一行是代码中断并给出错误的地方:设置的ColorBlend 对象无效。位置的最后一个元素必须等于 1.0。ColorBlend 对象必须使用相同数量的位置和颜色值来构造。位置必须介于 0.0 和 1.0 之间,1.0 表示数组中的最后一个元素。

奇怪的是,这只发生在某些图表上而不是其他图表上。我注意到在一个特定的图表上,如果图表有 10 个或更多的 x 值,那就没问题了。但如果值少于 10 个,则它会中断。我也尝试过使用临时文件将 svg 和图像存储到相同的结果中。

我的想法已经用完了,所以有人有建议吗?也许另一种从 svg 到 c# 中的图像的方法。我看过inkscape,但我不能使用它,因为它需要在服务器上安装为.exe。

编辑:我找到了使用 javascript 的可能解决方案。对我不起作用,因为它使用 HTML5 的 canvas 元素,我需要它在 IE8 中工作,但以防其他人偶然发现。 在浏览器中将 SVG 转换为图像(JPEG、PNG 等)

解决方案:我决定为所有支持 HTML5 的浏览器和 IE8 的 inkscape 方法实现上面显示的 javascript 方法。

4

1 回答 1

2

我只是偶然发现了同样的问题。首先,我尝试从该项目的主干更新到最新的代码,但这并没有解决问题。

问题在于函数中的文件 SVGProject/Painting/SvgGradientServer.csprotected ColorBlend GetColorBlend(ISvgRenderer renderer, float opacity, bool radial)

该函数生成一个ColorBlend对象,其中Positions数组的最后一个元素有时不是 1.0,而是例如 1.00000012 或 0.99999994。GetBrush这会在 SVGProject/Painting/SvgGradientServer.cs中导致以下行中的异常:

InterpolationColors = CalculateColorBlend(renderer, opacity, points[0], effectiveStart, points[1], effectiveEnd),

问题可能是浮点值的舍入错误。我没有进一步分析它,只是添加了一个修复Positions数组最后一个元素的检查。这对我有用。

于 2015-11-24T15:29:11.673 回答