最近專案中涉及到瀏覽器整頁截圖的功能,有點複雜,研究了一天,終於在ie瀏覽器下實現,至於其他瀏覽器,以後再研究。
所謂整頁截圖,就是說把整個頁面全部截進去,包括通過滾動才能看到的部分。
方法是好的,悲催的是,沒有乙個**是能正常執行的,相信很多人都有同感!沒辦法,自己動手,豐衣足食。
我需要用.net來實現。分析一下,主要有以下幾個技術點:
1、如何取得瀏覽器物件。首先要確定ie版本,我用的是ie8瀏覽器,物件結構和ie6、ie7有點區別。這個可以通過win32api中的findwindow函式來實現。
2、對指定控制項截圖。這個可以通過win32api中的printwindow函式來實現,這個函式有乙個優點:即使瀏覽器被其它視窗擋住,也可以正常截圖。但是,如果瀏覽器視窗最小化了,那就漆黑一片了。。。
3、合併。這個用gdi+可以很方便地實現。在記憶體中建立乙個大的畫布,然後將從上至下依次畫上去即可。
開始動手。
首先,建立乙個console應用程式(用form程式也沒關係)。
(1)新增對system.drawing和system.windows.forms的引用。
(2)新增對兩個com元件的引用:shdocvw、mshtml,並設定屬性「嵌入互操作型別」為false(這個很重要,否則無法接下來的程式無法編譯通過)。
(3)將程式入口main方法標記為[stathread](這個也很重要,否則接下來的程式會執行失敗)。
然後,加入win32api類,該類對幾個重要的api進行了封裝,接下來我們會用到這些api。**如下:
using最後,加入主程式。**邏輯如下:system;
using
system.runtime.interopservices;
namespace
iecapture}}
(1)獲取當前ie瀏覽器物件。
(2)獲取瀏覽器核心控制項的矩形區域,計算整個頁面一共有多少屏。
(3)通過滾動視窗的方式,對每一屏的頁面進行截圖。
(4)將所有合併為一張整的。
主程式的源**如下:
using【總結】system;
using
system.collections.generic;
using
system.linq;
using
system.drawing;
using
system.windows.forms;
namespace
iecapture
//查詢瀏覽器核心控制項
intptr childhandle1 = win32api.findwindowex(new intptr(webbrowser.hwnd), intptr.zero, "
frame tab
", intptr.zero);
intptr childhandle2 = win32api.findwindowex(childhandle1, intptr.zero, "
tabwindowclass
", intptr.zero);
intptr childhandle3 = win32api.findwindowex(childhandle2, intptr.zero, "
shell docobject view
", intptr.zero);
intptr childhandle4 = win32api.findwindowex(childhandle3, intptr.zero, "
internet explorer_server
", intptr.zero);
if (childhandle4 ==intptr.zero)
//獲取瀏覽器核心控制項的矩形區域
win32api.rect rc = new
win32api.rect();
win32api.getwindowrect(childhandle4,
refrc);
int pageheight = rc.bottom -rc.top;
//獲取html文件物件
mshtml.ihtmldocument2 htmldoc =(mshtml.ihtmldocument2)webbrowser.document;
//計算總共有多少頁,以及最後一頁的高度
int pagecount = htmldoc.body.offsetheight /pageheight;
int lastpageheight = htmldoc.body.offsetheight %pageheight;
if (lastpageheight > 0) pagecount++;
int scrollbarwidth = pagecount > 1 ? systeminformation.verticalscrollbarwidth : 0
;
//列表,用於放置每一屏的截圖
listpageimages = new list();
//一頁一頁地滾動截圖
htmldoc.parentwindow.scrollto(0, 0
);
for (int pageindex = 0; pageindex < pagecount; pageindex++)
htmldoc.parentwindow.scrollby(
0, pageheight);
}//拼接所有
image fullimage =mergeimages(pageimages);
if (fullimage == null
)
//將截圖儲存到指定目錄
try
finally
console.readline();
}//////
合併。
/// ///
列表。 ///
合併後的。
static image mergeimages(listimagelist)
}return
fullimage;
}//////
獲取的指定區域。
/// ///
原始。 ///
目標區域。
///static
image getimagebyrect(image image, rectangle rect)
return
bitmap;
}//////
為指定視窗或控制項截圖。
/// ///
控制代碼。 ///
截圖。 static
image capturewindow(intptr hwnd)}}
(1)僅在ie8瀏覽器上測試通過,無法在firefox、chrome上執行。即使同是ie家族的ie6、ie7、ie9,我也不敢保證能正常執行,各位同學可以測試一下,並嘗試修改,歡迎交流。
(2)如果有浮動div隨著頁面一起滾動,在每一屏上都會被截圖。
(3)未考慮水平滾動條的影響。
(4)未考慮在多執行緒環境下的應用。
最後附上乙個cnblogs.com首頁的截圖,看看效果:)
IE瀏覽器整頁截圖程式(二)
實現步驟如下 1 新建乙個form應用程式,在窗體上新增乙個panel,假設name為panel1,設定 panel1.autoscroll true。2 在panel1中放置乙個webbrowser控制項,假設name為webbrowser1,設定 webbrowser1.scripterrors...
瀏覽器長截圖
利用chrome瀏覽的開發者工具,完美實現網頁全屏截圖,不需要安裝任何外掛程式,大家快來試試吧。ctrl shift i f12 ctrl shift p 輸入 screen 選擇不用的方式擷取 整個網頁 capture full size screenshot 節點網頁 capture node ...
selenium實現瀏覽器截圖,拖拽頁面元素
1.實現瀏覽器截圖 呼叫getscreenshotas方法把當前瀏覽器開啟的頁面進行截圖,儲存到file物件中 file scrfile takesscreenshot driver getscreenshotas outputtype.file try catch ioexception e 2....