svg到png图像的浏览器内转换(包括IE在内的跨浏览器)
In browser conversion of svg to png image (cross browser including IE)
我使用的是Highcharts,我需要将页面上的所有图表转换为一个可以发送到服务器的图像,这样我就可以将其合并到主导出excel中,该excel已经包含一些表和数据透视网格。这是我迄今为止的代码
var svg = Highcharts.getSVG(charts);
img = new Image();
img.src = "data:image/svg+xml," + encodeURIComponent(svg);
mycanvas = document.createElement('canvas');
mycanvas.width = 1000
mycanvas.height = 1000
ctx = mycanvas.getContext("2d");
ctx.drawImage(img, 0, 0);
$("body").append("<image src='" + mycanvas.toDataURL("image/png") + "'/>");
$.ajax({
type: "POST",
url: '@Url.Action("getfile")',
data: JSON.stringify({ file: mycanvas.toDataURL("image/png").replace("data:image/png;base64,", "") }),
contentType: 'application/json; charset=utf-8'
});
这是我测试是否从客户端正确获取数据的c#代码(我只是将base64字符串写入一个文件)。Firefox和Chrome正确写入图像,IE只给我一个黑色图像
public void getfile(string file)
{
System.IO.File.WriteAllBytes(@"c:'yourfile.png", Convert.FromBase64String(file));
}
你可以在这里找到整个代码http://jsfiddle.net/gd7bB/2291/
这个图片在Firefox和Chrome中似乎生成得很好,但在IE中却没有(这里我只得到一个黑色的图片)。我正在使用一个画布,从我收集到的IE支持IE9对HTML5画布标签的支持。
如果你能帮我找出我做错了什么,或者你能指出一个更好的解决方案,我将不胜感激
IE9似乎确实支持画布元素https://msdn.microsoft.com/fr-fr/library/ff975241(v=vs.85).aspx
以下toDataURL的示例/测试代码适用于我的IE11:http://samples.msdn.microsoft.com/Workshop/samples/canvas/todataurl.html
你给的小提琴在IE11中不起作用;从控制台错误来看,这会导致在图像完成渲染之前无法调用drawImage。IE抛出
调用不支持的方法或方法的属性
添加setTimeout允许IE渲染动态图像并绕过此错误。
但这会导致
Security Error
因为IE似乎已经污染了画布,因为一些"跨来源"问题
SecurityError
The img or video element is not of the same origin or domain
as the document that owns the canvas element. Versions earlier
than Internet Explorer 10 use SECURITY_ERR.
出于安全原因,IE似乎污染了所有用SVG填充的图像-SVG包含的画布IE安全错误到DataURL
我设法使用canvg
获得了一个工作版本,它将SVG文件转换为画布指令-https://github.com/gabelerner/canvg
溶液可以归结为
var svg = Highcharts.getSVG(charts);
var mycanvas = document.createElement('canvas');
canvg(mycanvas, svg)
console.log(mycanvas.toDataURL("image/png"))
检查一下这把小提琴http://jsfiddle.net/6bxqbaeb/1/它在IE11 中工作
- 如何隐藏空<span>在IE中使用javascript.(注意,在其他浏览器中工作正常)
- 当在coldfusion中通过AJAX传递时,FORM提交在IE浏览器中给出空表单
- 用于播放背景音乐的嵌入式flash播放器在IE浏览器中不起作用
- Json到CSV下载,可以在chrome中工作,但不能在IE浏览器中工作
- ng类仅适用于所有IE浏览器
- 通过运行条件编译防止JS泄露IE浏览器
- 无法从IE中的data.responseText获取结果,但在其他浏览器中工作
- 如何检查设备是Windows Surface Tablet,浏览器是Chrome还是IE
- 如果用户的浏览器早于以下版本,则显示一条消息:IE 10、Firefox 39、Chrome 39、Opera 8
- 为什么IE浏览器不喜欢我的点击事件
- Javascript 错误:对象在 IE 浏览器中不支持此属性或方法
- 如何在浏览器非IE上阅读word文档
- 对于IE浏览器,我需要使用什么来禁用Internet Explorer的默认下拉样式
- 是否有一个JavaScript IDE允许在所有三种浏览器(IE,FF,Chrome)中进行调试
- 我可以检测某些浏览器(IE)设置吗(不更改,检测)
- 如何从系统中获取文件上传的路径-支持的浏览器IE
- 分解Js脚本,将HTML5/CSS3行为引入旧浏览器(IE)
- javascript将所有浏览器(IE、Firefox、Opera、Google chrome)的enterkey转换为
- 跨浏览器 - IE JavaScript 设置 style.left 不起作用
- 如何获得浏览器(IE)打印页面设置使用javascript/经典asp