提交 | 用户 | 时间 | ||
58d006 | 1 | /* Flot plugin for plotting images. |
A | 2 | |
3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. | |
4 | Licensed under the MIT license. | |
5 | ||
6 | The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and | |
7 | (x2, y2) are where you intend the two opposite corners of the image to end up | |
8 | in the plot. Image must be a fully loaded Javascript image (you can make one | |
9 | with new Image()). If the image is not complete, it's skipped when plotting. | |
10 | ||
11 | There are two helpers included for retrieving images. The easiest work the way | |
12 | that you put in URLs instead of images in the data, like this: | |
13 | ||
14 | [ "myimage.png", 0, 0, 10, 10 ] | |
15 | ||
16 | Then call $.plot.image.loadData( data, options, callback ) where data and | |
17 | options are the same as you pass in to $.plot. This loads the images, replaces | |
18 | the URLs in the data with the corresponding images and calls "callback" when | |
19 | all images are loaded (or failed loading). In the callback, you can then call | |
20 | $.plot with the data set. See the included example. | |
21 | ||
22 | A more low-level helper, $.plot.image.load(urls, callback) is also included. | |
23 | Given a list of URLs, it calls callback with an object mapping from URL to | |
24 | Image object when all images are loaded or have failed loading. | |
25 | ||
26 | The plugin supports these options: | |
27 | ||
28 | series: { | |
29 | images: { | |
30 | show: boolean | |
31 | anchor: "corner" or "center" | |
32 | alpha: [ 0, 1 ] | |
33 | } | |
34 | } | |
35 | ||
36 | They can be specified for a specific series: | |
37 | ||
38 | $.plot( $("#placeholder"), [{ | |
39 | data: [ ... ], | |
40 | images: { ... } | |
41 | ]) | |
42 | ||
43 | Note that because the data format is different from usual data points, you | |
44 | can't use images with anything else in a specific data series. | |
45 | ||
46 | Setting "anchor" to "center" causes the pixels in the image to be anchored at | |
47 | the corner pixel centers inside of at the pixel corners, effectively letting | |
48 | half a pixel stick out to each side in the plot. | |
49 | ||
50 | A possible future direction could be support for tiling for large images (like | |
51 | Google Maps). | |
52 | ||
53 | */(function(e){function n(e,t,n){var r=e.getPlotOffset();if(!n.images||!n.images.show)return;var i=n.datapoints.points,s=n.datapoints.pointsize;for(var o=0;o<i.length;o+=s){var u=i[o],a=i[o+1],f=i[o+2],l=i[o+3],c=i[o+4],h=n.xaxis,p=n.yaxis,d;if(!u||u.width<=0||u.height<=0)continue;a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),n.images.anchor=="center"&&(d=.5*(l-a)/(u.width-1),a-=d,l+=d,d=.5*(c-f)/(u.height-1),f-=d,c+=d);if(a==l||f==c||a>=h.max||l<=h.min||f>=p.max||c<=p.min)continue;var v=0,m=0,g=u.width,y=u.height;a<h.min&&(v+=(g-v)*(h.min-a)/(l-a),a=h.min),l>h.max&&(g+=(g-v)*(h.max-l)/(l-a),l=h.max),f<p.min&&(y+=(m-y)*(p.min-f)/(c-f),f=p.min),c>p.max&&(m+=(m-y)*(p.max-c)/(c-f),c=p.max),a=h.p2c(a),l=h.p2c(l),f=p.p2c(f),c=p.p2c(c),a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),d=t.globalAlpha,t.globalAlpha*=n.images.alpha,t.drawImage(u,v,m,g-v,y-m,a+r.left,f+r.top,l-a,c-f),t.globalAlpha=d}}function r(e,t,n,r){if(!t.images.show)return;r.format=[{required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}]}function i(e){e.hooks.processRawData.push(r),e.hooks.drawSeries.push(n)}var t={series:{images:{show:!1,alpha:1,anchor:"corner"}}};e.plot.image={},e.plot.image.loadDataImages=function(t,n,r){var i=[],s=[],o=n.series.images.show;e.each(t,function(t,n){if(!o&&!n.images.show)return;n.data&&(n=n.data),e.each(n,function(e,t){typeof t[0]=="string"&&(i.push(t[0]),s.push(t))})}),e.plot.image.load(i,function(t){e.each(s,function(e,n){var r=n[0];t[r]&&(n[0]=t[r])}),r()})},e.plot.image.load=function(t,n){var r=t.length,i={};r==0&&n({}),e.each(t,function(t,s){var o=function(){--r,i[s]=this,r==0&&n(i)};e("<img />").load(o).error(o).attr("src",s)})},e.plot.plugins.push({init:i,options:t,name:"image",version:"1.1"})})(jQuery); |