2010-11-16 26 views
22

J'utilise un plugin pour Jquery appelé FLOT http://code.google.com/p/flot/Comment enregistrer un graphique FLOT jQuery dans un format .png ou un autre format d'image?

Une fois le graphique rendu, je veux que le client puisse enregistrer le graphique dans un fichier pour plus tard. Toute idée sur la façon dont cela peut être fait sans demander au client de télécharger un outil de capture d'image ou d'outil?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html lang="en"> 
    <head> 
     <!--[if IE]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
     <title>Graph</title> 
     <link href="layout.css" rel="stylesheet" type="text/css"></link> 
     <!--[if IE]><script language="javascript" type="text/javascript" src="lib/flot/excanvas.min.js"></script><![endif]--> 
     <script language="javascript" type="text/javascript" src="lib/canvas2image/base64.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/canvas2image/canvas2image.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/flot/jquery.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/gChart/jquery.gchart.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/flot/jquery.flot.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/flot/jquery.flot.selection.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/flot/jquery.flot.crosshair.js"></script> 
     <script language="javascript" type="text/javascript" src="lib/flot/jquery.flot.navigate.js"></script> 
     <style> 
     </style> 
    </head> 
    <body> 

<div id="placeholder" style="width:1000px;height:400px;"></div> 
<div id="test" style="display: none; background: #ff0; padding: 5px; border: 1px solid #ddd; position: absolute;"></div> 

<script type="text/javascript"> 
    $(function() { 
     var options0 = { 
     xaxis: {mode: "time"}, 
     legend: {position: "nw"}, 
     lines: {show: true}, 
     grid: {hoverable: true}}; 
     var grid_data0 = [[new Date(1286172000 * 1000), 1219], [new Date(1286258400 * 1000), 1583], [new Date(1286344800 * 1000), 1566], [new Date(1286431200 * 1000), 2191], [new Date(1286517600 * 1000), 2471], [new Date(1286604000 * 1000), 3128], [new Date(1286690400 * 1000), 2713], [new Date(1286776800 * 1000), 2117], [new Date(1286863200 * 1000), 3174], [new Date(1286949600 * 1000), 3051], [new Date(1287036000 * 1000), 3582], [new Date(1287122400 * 1000), 3472], [new Date(1287208800 * 1000), 3928], [new Date(1287295200 * 1000), 3688], [new Date(1287381600 * 1000), 2547], [new Date(1287468000 * 1000), 1549], [new Date(1287554400 * 1000), 3008], [new Date(1287640800 * 1000), 2309], [new Date(1287727200 * 1000), 2973], [new Date(1287813600 * 1000), 3805], [new Date(1287900000 * 1000), 3643], [new Date(1287986400 * 1000), 2310], [new Date(1288072800 * 1000), 2323], [new Date(1288159200 * 1000), 2399], [new Date(1288245600 * 1000), 2305], [new Date(1288332000 * 1000), 2393], [new Date(1288418400 * 1000), 3212], [new Date(1288504800 * 1000), 3348], [new Date(1288591200 * 1000), 2391], [new Date(1288677600 * 1000), 2130], [new Date(1288764000 * 1000), 1896], [new Date(1288850400 * 1000), 1765], [new Date(1288936800 * 1000), 2191], [new Date(1289023200 * 1000), 3008], [new Date(1289109600 * 1000), 3085], [new Date(1289199600 * 1000), 2151], [new Date(1289286000 * 1000), 2011], [new Date(1289372400 * 1000), 2016], [new Date(1289458800 * 1000), 1914]]; 
     var plot = $.plot($("#placeholder"), [{data: grid_data0}, ], options0); 
    }); 

$("#placeholder").mouseout(function(e){ 
$("#test").hide(); 
}); 

function test() { 
//var oCanvas = $("#placeholder");//document.getElementById("placeholder"); 
//img=document.createElement("img"); 
//Save 
//img.src=oCanvas.toDataUrl(); 
//Restore 
//oCanvas.drawImage(img, 0, 0); 
//var oCanvas = $("#placeholder");//document.getElementById("placeholder"); 
//document.write(document.getElementById('placeholder').toDataUrl()); 
    Canvas2Image.saveAsPNG(document.getElementById('placeholder')); 
//Canvas2Image.saveAsPNG(oCanvas, true); 
} 
</script> 
<a onClick="JavaScript:test();">Click</a> 
    </body> 
</html> 

Répondre

11

La méthode de base pour le faire utilise canvas.toDataURL("image/png"); mais je trouve aussi ce lien pour vous

http://nihilogic.dk/labs/canvas2image/

Je ne l'ai pas testé.

+0

Je reçois une erreur "oScaledCanvas.toDataURL n'est pas une fonction" lorsque je tente de l'exécuter. En outre, il semble qu'il ne fonctionne que dans aucun navigateur IE. (J'utilise FireFox, cependant, le client pourrait utiliser IE). – Josh

+3

Vous allez avoir beaucoup de toile de soutien de la douleur dans IE. (Rappelez-vous, je vous ai prévenu.) – Hogan

+1

toDataURL fait partie de HTML5: http://www.w3.org/TR/html5/the-canvas-element.html – Hogan

2

Vous pouvez regarder dans HighCharts qui a une fonction d'exportation et d'impression. Cela fonctionne en générant tous les graphiques en SVG avant le rendu sur le canevas. Lorsqu'un utilisateur veut une image, le javascript envoie le fichier SVG au serveur pour la convertir en image. Voir the Exporting Module pour plus de détails.

Les structures de données pour les graphiques hautes sont bien documented et pas trop difficile à porter sur les graphiques les plus hauts. Ils ont également beaucoup d'exemples que vous pouvez utiliser de manière interactive avec jsFiddle.

3

Si vous souhaitez utiliser Firefox, j'ai écrit WWW::Mechanize::Firefox, qui peut enregistrer la totalité de la page ou des éléments d'une page au format PNG.

Vous pouvez également automatiser complètement Firefox, ce que je fais avec ffeedflotr, un petit programme de traçage de données qui crée des graphiques de flot.