c# - SVG 渲染器抛出颜色混合对象对 telerik radhtmlchart 无效

标签 c# css svg telerik radhtmlchart

我意识到这是一个非常具体的问题,但我对 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 对象无效。 Position 的最后一个元素必须等于 1.0。 ColorBlend 对象必须使用相同数量的位置和颜色值构造。 位置必须在 0.0 和 1.0 之间,1.0 表示数组中的最后一个元素。

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

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

编辑: 我找到了使用 javascript 的可能解决方案。对我不起作用,因为它使用 HTML5 的 canvas 元素,我需要它在 IE8 中工作,但以防其他人偶然发现这个。 Convert SVG to image (JPEG, PNG, etc.) in the browser .

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

最佳答案

我刚刚遇到了同样的问题。首先,我尝试更新到该元素主干中的最新代码,但这并没有解决问题。

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

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

InterpolationColors = CalculateColorBlend(渲染器,不透明度,点 [0], effectiveStart, points[1], effectiveEnd),

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

关于c# - SVG 渲染器抛出颜色混合对象对 telerik radhtmlchart 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25268107/

相关文章:

svg - 将Raphael Canvas 下载为SVG或PDF

c# - 如何对表单应用程序中的所有实例仅调用一次方法 DriveMe() 或 color() 以减少重复。 C#

c# - 手动发布到 Asp.Net MVC Controller

html - table.class tr, th 和 table .class tr, th 有区别吗?

php - 我在设计过程中忘记了正确的列。可以添加右列吗?

svg - Raphael JS 组合路径

javascript - SVG 图形不会出现在使用 javascript 和内部样式的第二个 float 相对 div 列中

c# - 在单元测试中配置 log4net 以登录到控制台并显示正确的日期和时间

c# - 通过打开 xml sdk linq 查询获取具有行和列位置的 excel 单元格值

css - 如何将 'center' <div> 用于移动设备