我正在尝试将一个非常大的SVG(数据URL大约为750000-1000000个字符)通过将其数据URL传递到图像和画布中来转换为PNG,但是图像只加载了SVG的1/4。
创建方法如下:
var svg_xml = (new XMLSerializer()).serializeToString(svg),
url = 'data:image/svg+xml;base64,' + btoa(svg_xml);
var img = new Image();
img.width = 730;
img.height = 300;
img.onload = function(){
var canvas = document.create('canvas');
canvas.width = 730;
canvas.height = 300;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, 730, 300);
callbackFn(canvas.toDataURL('image/png');
}
img.src = url
编辑
我尝试使用canvg绘制SVG,但生成的DataURL导致图像为空白:
var svg_xml = (new XMLSerializer()).serializeToString(svg);
var canvas = document.createElement('canvas');
canvas.width = 730;
canvas.height = 300;
var ctx = canvas.getContext('2d');
ctx.drawSvg(svg_xml, 0, 0, 730, 300);
callbackFn(canvas.toDataURL('image/png');
我使用的方法有什么问题吗?
进一步编辑
我现在相当确信这是画布未能绘制整个图像,因为我尝试实施Blob解决方案以达到相同的效果:
var svg_xml = (new XMLSerializer()).serializeToString(svg),
blob = new Blob([svg_xml], {type:'image/svg+xml;charset=utf-8'}),
url = window.URL.createObjectURL(blob);
var img = new Image();
img.width = 730;
img.height = 300;
img.onload = function(){
var canvas = document.create('canvas');
canvas.width = 730;
canvas.height = 300;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, 730, 300);
window.URL.revokeObjectURL(url);
callbackFn(canvas.toDataURL('image/png');
}
img.src = url
图片再次正常加载,访问URL(在被撤销之前)也能正常显示图片。
画布数据URL的长度不一致,因此我认为这不是达到最大值的原因,有没有办法检测画布大小?该应用程序仅支持Chrome和FireFox。
new Image
和new Image()
都是有效的,如果您没有传递任何参数,可以省略括号。 - Jim Jones<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
- Don Rhummy