使用JavaScript截圖,這裡我要推薦兩款開源組件:一個是Canvas2Image,它可以將Canvas繪圖編程PNG/JPEG/BMP的圖像;但是光有它還不夠,我們需要給任意DOM(至少是絕大部分)截圖,這就需要html2canvas,它可以將DOM對象轉換成一個canvas對象。兩者的功能結合起來,就可以把頁面上的DOM截圖成PNG或者JPEG圖像了,很酷。
Canvas2Image
它的原理是利用了HTML5的canvas對象提供了toDataURL()的API:
復制代碼 代碼如下:
var strDataURI = oCanvas.toDataURL();
// returns "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACt..."
這樣的結果是base64編碼的(事實上,image也可以通過這種方式以字符串的形式寫死到頁面上),所以我們還需要一個base64編解碼的lib。
但是目前的缺陷也有不少,比如目前Opera和Safari只支持PNG,FireFox的支持性則好得多。
生成圖片有兩種方式寫入頁面,一種是生成一個圖片對象寫入頁面DOM樹中,這也是支持性比較好的方式:
復制代碼 代碼如下:
// returns an <img> element containing the converted PNG image
var oImgPNG = Canvas2Image.saveAsPNG(oCanvas, true);
但是如果你做一個JavaScript截圖功能的話,你可能希望截圖後能夠自動打開保存文件的“保存”對話框:
復制代碼 代碼如下:
Canvas2Image.saveAsPNG(oCanvas);
// will prompt the user to save the image as PNG.
這個方式調用會生成一個mimeType為“image/octet-stream”的數據流到浏覽器,但是“保存”對話框無法識別出圖片適當的後綴名,默認保存的文件在FireFox下是“xxx.part”這種名字,這是令人遺憾的地方,但是似乎沒有什麼好辦法解決。
html2canvas
它作用於DOM加載的過程,收集其中的信息,再來繪制canvas圖像,也就是說,其實它並不是將展現的DOM樹截成canvas圖,而是仿照DOM樹重新繪制了一張canvas圖。於是很多CSS樣式都無法被准確識別出來,無法准確反映到圖上。
其它的限制還有不少,比如:
●javascript必須是同域的,對於跨域的情況需要使用代理服務器(API中有參數可以指定),對於image也同樣;
●frame內的DOM樹無法被准確繪制;
●因為要繪制的是canvas圖,所以像IE8這樣的浏覽器需要使用FlashCanvas這樣的第三方庫。
這個頁面可以測試各個網站使用它來截圖的效果,效果相當不錯:
API使用的例子:
復制代碼 代碼如下:
html2canvas(
[dom1, dom2],
{
logging: false,
useCORS: false,
proxy: false,
onrendered: function(canvas){
// canvas 就是繪制的canvas是對象
}
}
);
對於這一類相對小眾的類庫,文檔都是很差的,包括API的定義,需要閱讀源碼,代碼上寫得挺清楚的。
另外,該站點下載包裡面還有一個JQuery的插件,對這個API做了一個封裝,可以無視。