C 截圖工具開發技術

2021-06-20 16:20:42 字數 1191 閱讀 9181

最近有乙個需要擷取當前螢幕,並儲存成bmp檔案的需求。整個需求,拆分成三步:1、擷取螢幕,獲得位圖資料。2、配合bmp檔案結構資訊,將資料整合。3、對整合後的資料做操作,如儲存在本地、通過網路傳送至伺服器等。

截圖首先獲得螢幕的hdc,通過getdc()這個api,接著建立乙個相容hdc,即comhdc,用來在記憶體裡表示擷取的點陣圖的上下文。 後面兩行**分別是獲得螢幕的寬度和高度。然後用createcompatiblebitmap這個api建立乙個相容的hbitmap,即我們的點陣圖控制代碼。建立好後,我們將其作為comhdc的選中位圖控制代碼(在這裡,我不知道怎麼措辭了,如果專門的措辭,請告知。)。然後呼叫bitblt,將hdc即螢幕的點陣圖複製到comhdc即hbitmap中。至此,我們已經獲得到所需位圖資料的全部資訊。

bmp檔案結構資訊

bmp檔案需由三部分組成:檔案頭(bitmapfileheader),位圖資訊頭(bitmapinfoheader)、位圖資料。我們將這所有的資料寫入硬碟的時候,需要按照順序依次將三個部分寫入。檔案頭和位圖資訊頭是按照hbitmap以及它的hdc來構造的。

其中width和height為上文得到的螢幕寬高,其他數值請參考msdn。

位圖資訊頭的構造,**如下:

得到位圖資料的**如下:

在這裡主要運用getdibits來獲得資料,儲存在lpbitmap裡面。至此,我們獲得了所有的需要的資料:bmiheader(檔案頭)、bmfheader(位圖資訊頭)、lpbitmap(位圖資料)。

整合資料

我們先來談談儲存至硬碟。由於需要寫入檔案元資訊,我們需要用二進位制的方式寫檔案,運用c++標準庫,**如下:

此時,就可以在專案目錄裡面獲得乙個存有當前螢幕快照的bmp檔案了。

現在,我們發揮一下想象力,如果這段程式執行在別人的電腦上,通過這段程式,我們獲得了他or她的螢幕快照,為了避免被發現這些操作,我們不能儲存這些資料在硬碟上,直接將這些資料傳到我們這……。我們可以整合這些資料,將它們存放在任何我們想要存放的地方:db,伺服器,硬碟等等。我們將所有的資料整合成乙個二進位制資料塊:

現在,所有的資訊都放在alldata裡面了, 我們可以寫入檔案:

可以通過socket傳送到網路的另一端,然後再儲存,也可以直接存入資料庫。whatever u want!

總結c++在底層用起來非常方便,可以隨意轉換資料,只要我們確定資料的結構及其大小即可。**我就不上傳了,非常短,別忘了釋放new出的記憶體以及創造的相容hdc等資源哦。

anydesk截圖技術

anydesk針對不同的作業系統使用了不同的截圖技術 針對nt5系統使用ddraw截圖。針對nt6系統優先使用dxgi截圖,如果不支援dxgi則使用dx截圖。為什麼這樣做呢?首先directdraw覆蓋了全系統,但是dx確不一定是什麼版本了,在nt5上使用ddraw速度肯定是比gdi快的 如果win...

DXGI快速截圖錄屏技術

很多地方都需要用到截圖 錄屏技術,比如桌面直播,桌面錄製等等。在微軟windows平台,有很多截圖的介面,不過大多數效能並不理想,windows8以後微軟引入了一套新的介面,叫 desktop duplication api 應用程式,可以通過這套api訪問桌面資料。而由於desktop dupli...

python 實現的截圖工具

新增了透視裁剪工具 類似於ps裡的用法 多邊形截圖工具 取色器工具 油漆桶工具 背景還原畫筆 配合背景橡皮擦使用 支援回退10步操作歷史記錄 新增一鍵還原按鈕 新增智慧型選框的開關。畫筆等增加透明度支援,在畫筆 標記時可以通過按住ctrl鍵 滾輪快速調整畫筆透明度,新增常用顏色到取色按鈕 滑鼠劃過即...