如何将base64 svg图像转换为base64图像png

问题描述:

我有一个将图表转换为svg的代码。但我需要输出格式为PNG图像。 svgString2Image是返回编码的base64 svg的函数。我该怎么做?非常感谢你。如何将base64 svg图像转换为base64图像png

function svgString2Image(svgString, width, height, format, callback) { 
    //console.log("svgString",svgString) 
    format ? format : 'png'; 

    var imgsrc = 'data:image/svg+xml;base64,'+ btoa(unescape(encodeURIComponent(svgString))); // Convert SVG string to data URL 
    var canvas = document.createElement("canvas"); 
    var context = canvas.getContext("2d"); 

    canvas.width = width; 
    canvas.height = height; 

    var image = new Image(); 
    image.onload = function() { 
     context.clearRect (0, 0, width, height); 
     context.drawImage(image, 0, 0, width, height); 

     canvas.toBlob(function(blob) { 
      var filesize = Math.round(blob.length/1024) + ' KB'; 
      if (callback) callback(blob, filesize); 
     }); 

    }; 
    ///**************************** 
    document.getElementById('my_image').src=imgsrc; 
    return image.src = imgsrc; 

} 

http://plnkr.co/edit/lPhmuYywPCdjQrnwhQcH?p=preview

+1

使用回调。 – Bergi

+0

@meager链接的问答如何解决当前问题的代码问题? – guest271314

+0

'format'从不使用,但canvas.toBlob默认为'image/png'。如果您想要指定格式,请在canvas.toBlob中添加''image /'+ format'作为第二个参数。 –

正如@ guest271314和我在评论中所述,使用canvas.toDataURL时base64字符串是不需要的,canvas.toBlob。此外image.onload是异步的,因此不可能“返回”base64 png字符串。您必须使用回叫(或Promise,如@ guest271314所述)。

function svgString2Image(svgString, width, height, format, callback) { 
    // set default for format parameter 
    format = format ? format : 'png'; 
    // SVG data URL from SVG string 
    var svgData = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svgString))); 
    // create canvas in memory(not in DOM) 
    var canvas = document.createElement('canvas'); 
    // get canvas context for drawing on canvas 
    var context = canvas.getContext('2d'); 
    // set canvas size 
    canvas.width = width; 
    canvas.height = height; 
    // create image in memory(not in DOM) 
    var image = new Image(); 
    // later when image loads run this 
    image.onload = function() { // async (happens later) 
     // clear canvas 
     context.clearRect(0, 0, width, height); 
     // draw image with SVG data to canvas 
     context.drawImage(image, 0, 0, width, height); 
     // snapshot canvas as png 
     var pngData = canvas.toDataURL('image/' + format); 
     // pass png data URL to callback 
     callback(pngData); 
    }; // end async 
    // start loading SVG data into in memory image 
    image.src = svgData; 
} 

// call svgString2Image function 
svgString2Image(svgString, 800, 600, 'png', /* callback that gets png data URL passed to it */function (pngData) { 
    // pngData is base64 png string 
}); 
+0

谢谢!我可以在不使用回调的情况下获得base64字符串,例如:'var png = svgString2Image(svgString,800,600,'png)' – yavg

+0

“另外image.onload是异步的,因此不可能”返回“base64 png字符串。你必须使用callback(或者以@ guest271314表示的Promise)。“ - 从回答请读 –

+0

好吧,我想知道是否有另一种方法。非常感谢你。 – yavg

无功能传递给svgString2Image在最后一个参数。将函数传递给svgString2Image,该函数预计参数为blobfilesize

+0

你能帮我吗?我只需要在base64中返回一个图像的结果png – yavg

+0

'return'是什么意思?你编写了这个函数; 'callback'的目的是什么? 'svgString2Image(svgString,800,600,'png',function(blob,filesize){//做blob和filesize});' – guest271314

+0

这意味着,返回字符串base64在png中。我没有用这部分代码的目的。我有它的情况下,这可以帮助产生字符串在PNG。 – yavg