2012-04-20 64 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,它會爲圖像生成透明背景。照顧背景圖像取決於你。