2010-11-16 62 views
22

我正在使用一个名为FLOT的Jquery插件http://code.google.com/p/flot/如何将jQuery FLOT图形保存为.png或其他图像格式?

一旦呈现图形,我希望客户端能够将图形保存到文件中以备后用。有关如何在不需要客户端下载某些工具或图像捕获设备的情况下完成这一任务的想法?

<!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> 

回答

11

基本的方式做到这一点是使用canvas.toDataURL("image/png");但我也发现了这个链接,你

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

我没有测试它。

+0

当我尝试运行它时,出现一些“oScaledCanvas.toDataURL不是函数”错误。此外,它似乎只适用于没有IE浏览器。 (但我使用的是FireFox,客户端可能使用IE)。 – Josh 2010-11-16 18:43:48

+3

在IE中你将会有很多支持画布的痛苦。 (请记住,我提醒过你。) – Hogan 2010-11-16 18:59:27

+1

toDataURL是HTML5的一部分:http://www.w3.org/TR/html5/the-canvas-element.html – Hogan 2010-11-16 19:02:28

2

您可能会考虑具有导出和打印功能的HighCharts。它通过在画布上呈现之前在SVG中生成所有图形来工作。当用户需要图像时,javascript会将SVG发送到服务器以转换为图像。有关更多详细信息,请参阅the Exporting Module

highchart的数据结构是好的documented,并不太难以将flot连接到highcharts。他们也有很多可以用jsFiddle交互玩的例子。

3

如果您愿意使用Firefox,我写了WWW::Mechanize::Firefox,它可以将页面上的整个页面或元素保存为PNG。

您还可以完全自动化Firefox,我使用ffeedflotr这个创建flot图表的小型数据绘图程序。

相关问题