溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MonkeyImage API 實(shí)踐全記錄

發(fā)布時(shí)間:2020-05-15 04:13:25 來源:網(wǎng)絡(luò) 閱讀:2608 作者:zhukev 欄目:移動開發(fā)

1.    背景

鑒于網(wǎng)上使用MonkeyImage的實(shí)例除了方法sameAs外很難找到,所以本人把實(shí)踐各個(gè)API的過程記錄下來然自己有更感性的認(rèn)識,也為往后的工作打下更好的基礎(chǔ)。同時(shí)也和上一篇文章《MonkeyDevcie API 實(shí)踐全記錄》起到相互呼應(yīng)的作用。

因?yàn)椴]有MonkeyRunner的項(xiàng)目背景,所以這里更多的是描述各個(gè)API是怎么一回事,而不是描述在什么場景下需要用到。也就是說是去回答What,而不是How。

首先我們先看下官方給出的MonkeyImage的API描述,對比我現(xiàn)在反編譯的最新的源碼是一致的:

Return Type

Methods

Comment

string

convertToBytes (string format)

Converts the current image to a particular format and returns it as a string that you can then access as an iterable of binary bytes.

 

tuple

getRawPixel (integer x, integer y)

Returns the single pixel at the image location (x,y), as an a tuple of integer, in the form (a,r,g,b).

 

integer

getRawPixelInt (integer x, integer y)

Returns the single pixel at the image location (x,y), as a 32-bit integer.

 

MonkeyImage

getSubImage (tuple rect)

Creates a new MonkeyImage object from a rectangular selection of the current image.

 

boolean

sameAs (MonkeyImage other, float percent)

Compares this MonkeyImage object to another and returns the result of the comparison. Thepercent argument specifies the percentage difference that is allowed for the two images to be "equal".

 

void

writeToFile (string path, string format)

Writes the current image to the file specified by filename, in the format specified by format.

 

 

2.      String convertToBytes(string format)

2.1  示例

img = device.takeSnapshot()  png1 = img.convertToBytes()  png2 = img.convertToBytes()  bmp = img.convertToBytes('bmp')  jpg = img.convertToBytes('JPG')  gif = img.convertToBytes('gif')  raw = img.convertToBytes('raw')  invalid = img.convertToBytes('xxx')  #is the 2 pngs equal? print "Two png is equal in bytes:",png1 == png2  #is the png equals to bmp? print "png and bmp is equal in bytes:", png1 == bmp  #is the jpg eqals to the raw? print "jpg and bmp is equals in bytes:",jpg == bmp  #is the jpg eqals to the xxx? print "jpg is a valid argument:",jpg != invalid  #is the gif eqals to the xxx? print "gif is a valid argument:",gif != invalid  #is the bmp eqals to the xxx? print "bmp is a valid argument:",bmp != invalid  #is the raw equas to xxxx? aims at checking whether argument 'raw' is invalid like 'xxx' print 'raw is a valid argument:',raw != invalid  #would invalid argument drop to png by default? print 'Would invalid argument drop to png by default:',png1 == invalid
輸出:

MonkeyImage API 實(shí)踐全記錄


2.2 分析

除了默認(rèn)的png,常用格式j(luò)pg,gif都支持,但bmp格式無效,至于還支持什么其他格式,嘗試跟蹤了下代碼,沒有找到想要的結(jié)果

3. tuple getRawPixel(integer x, integer y)Integer getRawPixelInt (integer x, integer y)

3.1 示例

viewer = device.getHierarchyViewer() note = viewer.findViewById('id/title') text = viewer.getText(note) print text.encode('utf-8')  point = viewer.getAbsoluteCenterOfView(note) x = point.x y = point.y  img = device.takeSnapshot()  pixelTuple = img.getRawPixel(x,y) pixelInt = img.getRawPixelInt(x,y) print "Pixel in tuple:",pixelTuple print "Pixel in int:", pixelInt
輸出:
MonkeyImage API 實(shí)踐全記錄

3.2 分析

這里把兩個(gè)相似的方法放到一起來比較,他們都是獲得指定一個(gè)坐標(biāo)的argb值,其中a就是alpha(透明度),rgb就是顏色三元組紅綠藍(lán)了。但前者返回的是一個(gè)元組,后者返回的是整型。
那么兩個(gè)類型的值是怎么對應(yīng)起來的呢?其實(shí)就是第一個(gè)方法的元組的返回值(a,r,g,b)中的每個(gè)值轉(zhuǎn)換成8個(gè)bit的二進(jìn)制值然后按順序從左到右排列起來再轉(zhuǎn)換成十進(jìn)制整型就是第二個(gè)方法的返回值了。
以示例輸出為例,比如b在第一個(gè)返回值中是141,換成二進(jìn)制就是1001101,其他雷同。
MonkeyImage API 實(shí)踐全記錄
再看第二個(gè)方法的整型返回值是-7500403,轉(zhuǎn)換成二進(jìn)制其實(shí)就是11111111100011011000110110001101(至于下圖calculator轉(zhuǎn)換后為什么前面那么多個(gè)1,其實(shí)不用管他,因?yàn)槭秦?fù)數(shù)所以前面要加上FF之類而已),那么最后的8個(gè)bit轉(zhuǎn)換成十進(jìn)制其實(shí)就是上面的的141.
MonkeyImage API 實(shí)踐全記錄

4. MonkeyImage getSubImage(tuple rect)

4.1 示例

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage from com.android.monkeyrunner.easy import EasyMonkeyDevice,By from com.android.chimpchat.hierarchyviewer import HierarchyViewer from com.android.hierarchyviewerlib.models import ViewNode, Window from java.awt import Point  #from com.android.hierarchyviewerlib.device import   #Connect to the target targetDevice targetDevice = MonkeyRunner.waitForConnection()  easy_device = EasyMonkeyDevice(targetDevice)  #touch a button by id would need this targetDevice.startActivity(component="com.example.android.notepad/com.example.android.notepad.NotesList")  #invoke the menu options MonkeyRunner.sleep(6) #targetDevice.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP);  '''      public ViewNode findViewById(String id)       * @param id id for the view.      * @return view with the specified ID, or {@code null} if no view found. ''' #MonkeyRunner.alert("Continue?", "help", "Ok?")  pic = targetDevice.takeSnapshot() pic = pic.getSubImage((0,38,480,762))  newPic = targetDevice.takeSnapshot() newPic = newPic.getSubImage((0,38,480,762))  print (newPic.sameAs(pic,1.0)) newPic.writeToFile('./shot1.png','png')

4.2 分析

以上示例流程是
  • 打開NotePad的NotesList Activity
  • 按下Menu Options按鈕彈出“Add note”這個(gè)Menu Entry
  • 截取一個(gè)屏幕
  • 調(diào)用getSubImage來取得去掉屏幕最上面的狀態(tài)欄(因?yàn)橛袝r(shí)間不斷變化,所以每截屏一次可能都會有所改變)和最下面的Menu Options的一個(gè)Image
  • 再重復(fù)以上兩個(gè)步驟取得另外一個(gè)Image
  • 比較以上兩個(gè)image是否相同
  • 把第二個(gè)image寫到本地。

5 boolean sameAs(MonkeyImage other, float percent)

5.1 示例

見4.1

5.2 分析

流程見4.1,這里要注意第二個(gè)浮點(diǎn)型的參數(shù)是從0.0到1.0, 1.0代表必須100%相同,0.5代表可以有50%的Error Tolerance.

6. void writeToFile (string path, string format)

6.1 示例

請參見第4章節(jié)

6.2 分析

參數(shù)很明了,這里需要提一下的是第一個(gè)參數(shù)路徑,如果你填寫的是相對路徑的話,base用得是MonkeyRunner。也就是說示例中的圖片最終是保存在我的monkeyrunner可執(zhí)行程序的上一層目錄。


<strike id="etaqs"></strike>
<th id="etaqs"></th>
<strike id="etaqs"></strike>
  •  

    作者

    自主博客

    微信

    CSDN

    天地會珠海分舵

    http://techgogogo.com


    服務(wù)號:TechGoGoGo

    掃描碼:

    MonkeyImage API 實(shí)踐全記錄

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI