引子
今年中秋閑在家,總要找點事做。 前幾天開始學python,很早之前就有計劃拿下這門語言了,可惜一直拖到現在……不可否認,我也是個拖沓癥患者。在學習python的過程中,我很想了解這門語言適合做什么,能做什么,然后,從互聯網海量信息中得知,python不僅適合作為程序員學習第一門語言,也是黑客喜歡的語言,python被稱為各種語言的”膠水語言“。在這個過程中,無意間看到了一篇python前輩的博客——用python寫QQ美女找茬游戲外掛(點擊跳轉查看)。對于外掛,從沒涉足,也完全不了解,但那篇博客給了我思路,引起了我的興趣,編程這么久了,從沒考慮過做外掛,不知道用java能不能實現。我試著從互聯網找答案,基本都說java不適合做外掛,因為他的運行機制限制——運行在沙箱內,使其不能自由訪問底層API。但是我之前了解java的一個Robot類,能實現屏幕截圖,模擬鼠標鍵盤操作。對于實現那個外掛(或者叫輔助更合適)應該問題不大,因此,用java開發美女找茬輔助的想法就這樣應運而生。體驗 效果圖:
可執行jar下載地址: http://pan.baidu.com/s/1i3vGStB 源代碼下載: http://pan.baidu.com/s/1pJx63Mj 本程序及源代碼僅用于學習研究,請不要用于商業和非法目的,由此產生的法律糾紛,自行負責,作者本人一概不負任何責任!解析 實現思路: 1.截取屏幕; 2.根據游戲窗口獨特的圖標,查找游戲窗口左上角坐標; 3.根據窗口的坐標計算兩張對比圖片的位置,然后剪切出兩張圖片。 4.對比兩張圖片,找出不同的地方。 5.創建透明背景窗口,將找到的兩張圖片不同的地方用點繪制在該透明背景窗口上。 開發過程中主要涉及到一下幾個點,已經分篇說明:1.屏幕截圖及圖片剪切。(點擊這里查看)
2.圖片上查找圖片算法。(點擊這里查看)
3. 比較兩張同尺寸圖片,找出不同的地方。
類似上面圖片上查找圖片的算法,其實就是讀取兩張圖片為BufferedImage對象,取出每個像素點的GRB值進行比較,用一個同樣大小的二維數組記錄比較結果,相同的像素點位置記錄為0,不相同的像素點位置記錄為1。等到圖片比較完成后,就得到一個標記兩張圖片異同點的二位數組。
4. 透明背景窗口的妙用。
當設置窗口背景完全透明后,偶然發現透明的的地方類似窗口的破洞。這個特性可以很好的利用起來,比如,可以實現任意形狀的窗口。
在這里,利用這一特性,我在用點繪制兩張圖片不同的地方時,遍歷比較結果的二位數組,只關注標記為1的點,并且忽略掉了上下左右都是1的點,這樣繪制出來的效果就形成了中間鏤空的區域,加上我讓透明窗口始終保持最前,因此,雖然java的透明窗口始終覆蓋在游戲界面上,但鼠標依然可以點擊到游戲界面上的控件,非常神奇!
5.設置全局(操作系統級)熱鍵。(點擊這里查看)
6.鼠標拖拽。(點擊這里查看)
7.內存釋放。
本以為不需要這一步,當我寫完實際檢驗的時候,發現對比十幾對圖片后,再點擊按鈕,沒反應了,到控制臺輸出一看,原來是內存溢出了。因為寫的類的成員變量有幾個比較大的二維數組,每次比較都是重新實例化類。因此,有必要主動請求java虛擬機盡快進行垃圾回收,即調用System.gc(),需要說明的是,就算你調用了System.gc(),也不能保證java虛擬機馬上進行垃圾回收。另外,為了讓java虛擬機有效地找到不用的對象,因此,需要將不用的成員變量賦予null值。為了簡便,雖然我依然是每次比較都是重新實例化類,但在比較之前,我先請求進行垃圾處理,釋放內存。
總結 寫完之后我才發現,老早已經有java前輩寫過這個輔助了。寫這個小程序差不多花掉了我兩天時間,最后總算寫出來了,也有不少收獲與體會。然后,寫博客就是對著前兩天編碼的總結,同時,跟小伙伴們分享,共同進步。新聞熱點
疑難解答