2012-04-20 69 views
1

我知道这个问题已经在这里,但我认为这是不正确的答案。 到目前为止,我正在使用这种方法,它可以100%地工作,对于我所有的情节,jqPlot图像

请评论代码的效率等,我想知道它是否还有错误。

非常感谢。

function jqplotToImg(obj) { 
    var newCanvas = document.createElement("canvas"); 
    newCanvas.width = obj.find("canvas.jqplot-base-canvas").width(); 
    newCanvas.height = obj.find("canvas.jqplot-base-canvas").height()+10; 
    var baseOffset = obj.find("canvas.jqplot-base-canvas").offset(); 

    // make white background for pasting 
    var context = newCanvas.getContext("2d"); 
    context.fillStyle = "rgba(255,255,255,1)"; 
    context.fillRect(0, 0, newCanvas.width, newCanvas.height); 

    obj.children().each(function() { 
    // for the div's with the X and Y axis 
     if ($(this)[0].tagName.toLowerCase() == 'div') { 
      // X axis is built with canvas 
      $(this).children("canvas").each(function() { 
       var offset = $(this).offset(); 
       newCanvas.getContext("2d").drawImage(this, 
        offset.left - baseOffset.left, 
        offset.top - baseOffset.top 
       ); 
      }); 
      // Y axis got div inside, so we get the text and draw it on the canvas 
      $(this).children("div").each(function() { 
       var offset = $(this).offset(); 
       var context = newCanvas.getContext("2d"); 
       context.font = $(this).css('font-style') + " " + $(this).css('font-size') + " " + $(this).css('font-family'); 
       context.fillStyle = $(this).css('color'); 
       context.fillText($(this).text(), 
        offset.left - baseOffset.left, 
        offset.top - baseOffset.top + $(this).height() 
       ); 
      }); 
     } else if($(this)[0].tagName.toLowerCase() == 'canvas') { 
      // all other canvas from the chart 
      var offset = $(this).offset(); 
      newCanvas.getContext("2d").drawImage(this, 
       offset.left - baseOffset.left, 
       offset.top - baseOffset.top 
      ); 
     } 
    }); 

    // add the point labels 
    obj.children(".jqplot-point-label").each(function() { 
     var offset = $(this).offset(); 
     var context = newCanvas.getContext("2d"); 
     context.font = $(this).css('font-style') + " " + $(this).css('font-size') + " " + $(this).css('font-family'); 
     context.fillStyle = $(this).css('color'); 
     context.fillText($(this).text(), 
      offset.left - baseOffset.left, 
      offset.top - baseOffset.top + $(this).height()*3/4 
     ); 
    }); 

    // add the title 
    obj.children("div.jqplot-title").each(function() { 
     var offset = $(this).offset(); 
     var context = newCanvas.getContext("2d"); 
     context.font = $(this).css('font-style') + " " + $(this).css('font-size') + " " + $(this).css('font-family'); 
     context.textAlign = $(this).css('text-align'); 
     context.fillStyle = $(this).css('color'); 
     context.fillText($(this).text(), 
      newCanvas.width/2, 
      offset.top - baseOffset.top + $(this).height() 
     ); 
    }); 

    // add the legend 
    obj.children("table.jqplot-table-legend").each(function() { 
     var offset = $(this).offset(); 
     var context = newCanvas.getContext("2d"); 
     context.strokeStyle = $(this).css('border-top-color'); 
     context.strokeRect(
      offset.left - baseOffset.left, 
      offset.top - baseOffset.top, 
      $(this).width(),$(this).height() 
     ); 
     context.fillStyle = $(this).css('background-color'); 
     context.fillRect(
      offset.left - baseOffset.left, 
      offset.top - baseOffset.top, 
      $(this).width(),$(this).height() 
     ); 
    }); 

    // add the rectangles 
    obj.find("div.jqplot-table-legend-swatch").each(function() { 
     var offset = $(this).offset(); 
     var context = newCanvas.getContext("2d"); 
     context.fillStyle = $(this).css('background-color'); 
     context.fillRect(
      offset.left - baseOffset.left, 
      offset.top - baseOffset.top, 
      $(this).parent().width(),$(this).parent().height() 
     ); 
    }); 

    obj.find("td.jqplot-table-legend").each(function() { 
     var offset = $(this).offset(); 
     var context = newCanvas.getContext("2d"); 
     context.font = $(this).css('font-style') + " " + $(this).css('font-size') + " " + $(this).css('font-family'); 
     context.fillStyle = $(this).css('color'); 
     context.textAlign = $(this).css('text-align'); 
     context.textBaseline = $(this).css('vertical-align'); 
     context.fillText($(this).text(), 
      offset.left - baseOffset.left, 
      offset.top - baseOffset.top + $(this).height()/2 + parseInt($(this).css('padding-top').replace('px','')) 
     ); 
    }); 

    // convert the image to base64 format 
    return newCanvas.toDataURL("image/png"); 
} 
+0

这里可能是一个更好的选择,请参见测试 - 有点'jqplotToImage'扩展拉里Siden:https://开头github上。 com/lsiden/export-jqplot-to-png/blob/master/export-jqplot-to-png.js – Stefan 2012-10-10 12:49:05

回答

4

这不是一个错误,但如果您尝试将图像保存为PNG,它会为图像生成透明背景。照顾背景图像取决于你。