您的位置:首页 > 其它

MonkeyImage API 教程

2015-09-09 16:09 357 查看
MonkeyImage

一个用来控制设备或模拟器屏幕图像的猴子快跑(monkeyrunner)类。图像在截屏时通过屏幕缓冲区拷贝出来。该对象的方法允许你将图像转换为各种存储格式、存储与文件、剪裁以及和另一个MonkeyImage对象进行比较。

你不需要新建一个MonkeyImage实例。可以用MonkeyDevice.takeSnapshot()方法通过截屏来新建一个实例。

概览

方法
stringconvertToBytes(string format)

将当前图像转换成特定格式,并且作为字符串返回。你可以将它作为可迭代的二进制字节来访问。
tuplegetRawPixel(integer x, integer y)

返回图像位置坐标(x,y)上的单个像素点,作为一个整数元组,以(a,r,g,b)格式。
integergetRawPixelInt(integer x, integer y)

返回图像位置坐标(x,y)上的单个像素点,作为一个32位的整数。
MonkeyImagegetSubImage(tuple rect)

将当前图像上矩形选框选出的区域新建一个MonkeyImage对象。
booleansameAs(MonkeyImage other, float percent)

将该MonkeyImage对象与其他的进行比较,并返回比较的结果。percent参数指定两个图像之间差异在多少百分比之内可以看做“相等”。
voidwriteToFile(string path, string format)

用指定的文件名将图像以指定的格式写入文件。

公有方法

string convertToBytes (string format)
将当前图像转换成特定格式,并且作为字符串返回。你可以将它作为可迭代的二进制字节来访问。

参数format 期望输出的格式。支持所有常见的栅格化输出格式。默认值是“png”(Portable Network Graphics编写网络图像)。

示例

[python] view
plaincopy

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

输出:





tuple getRawPixel (integer x, integer y)
返回图像位置坐标(x,y)上的单个像素点,作为一个整数元组,以(a,r,g,b)格式。

参数x 水平方向像素位置,在截屏方向的最左边为0点。y 垂直方向像素位置,在截屏方向的最顶端为0点。返回以(a,r,g,b)格式返回一个代表像素的整数元组,其中a是透明度,r,g,b分别是红绿蓝三个颜色值。

integer getRawPixel (integer x, integer y)
返回图像位置坐标(x,y)上的单个像素点,作为一个32位的整数。

参数x 水平方向像素位置,在截屏方向的最左边为0点。y 垂直方向像素位置,在截屏方向的最顶端为0点。返回一个由像素的a,r,g,b的8位通道值组成的32位整数。其中a是最左边的8位值,r是近邻的8位,以此类推。

示例

[python] view
plaincopy

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

输出:



这里把两个相似的方法放到一起来比较,他们都是获得指定一个坐标的argb值,其中a就是alpha(透明度),rgb就是颜色三元组红绿蓝了。但前者返回的是一个元组,后者返回的是整型。
那么两个类型的值是怎么对应起来的呢?其实就是第一个方法的元组的返回值(a,r,g,b)中的每个值转换成8个bit的二进制值然后按顺序从左到右排列起来再转换成十进制整型就是第二个方法的返回值了。
以示例输出为例,比如b在第一个返回值中是141,换成二进制就是1001101,其他雷同。
再看第二个方法的整型返回值是-7500403,转换成二进制其实就是11111111100011011000110110001101(至于下图calculator转换后为什么前面那么多个1,其实不用管他,因为是负数所以前面要加上FF之类而已),那么最后的8个bit转换成十进制其实就是上面的的141.

MonkeyImage getSubImage (tuple rect)
将当前图像上矩形选框选出的区域新建一个MonkeyImage对象。

参数rect 一个指定区域的元组(x,y,w,h)。x和y指定了选定区域左上角的0始像素位置。w代表选区宽度,h是高度,都是以像素为单位。图像的方向与截屏时的手机方向相同。返回
一个包含选定区域的MonkeyImage对象。

boolean sameAs ( MonkeyImage otherImage, float percent
)
将该MonkeyImage对象与其他的进行比较,并返回比较的结果。percent参数指定两个图像之间差异在多少百分比之内可以看做“相等”。

参数otherImage 用来与本对象比较的另一个MonkeyImage对象。percent 一个0.0-1.0之间(0.0和1.0包含)浮动的浮点数(float),它表示一个用来使该方法返回“真”的两个图像含有相同像素的百分比。默认值是1.0,即所有的像素必须相同。返回两个图像相同则返回“true”,反之返回“false”。

void writeToFile (string filename, string format)
用指定的文件名将图像以指定的格式写入文件。

参数filename 完全合法的文件名和输出格式的扩展名后缀。
format 文件输出格式。若未指定,则该放假通过文件名的扩展名来猜测文件格式。若未提供扩展名,则默认使用“png”(Portable Network Graphics便携网络图像)格式。

MonkeyImage验证性代码:

#conding=uft-8
import sys
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice
from com.android.monkeyrunner.easy import By
from datetime import datetime

device=MonkeyRunner.waitForConnection()
img1=device.takeSnapshot()#takeSnapshot()
img2=device.takeSnapshot()
result=img1.sameAs(img2,0.9)#sameAs()
subimg=img1.getSubImage((0,50,50,100))#getSubImage()
pic1=img1.convertToBytes()#convertToBytes()
path2=sys.path[0][sys.path[0].find(':')+1 : ]+"\\"+ datetime.now().strftime('%Y-%m-%d-%H-%M-%S')+".png"

'''
path2解析
print sys.path[0] #sys.path【0】返回 lib\monkeyrunner.jar:加上当前脚本所在路径
#输出结果为 lib\monkeyrunner.jar:C:\Users\ramos-cs\Desktop\monkeyrunner
index=sys.path[0].find(':')+1
print index # index为冒号后面的真实路径所在索引
#输出结果为21
path1=sys.path[0][index : ]#切片获取当前脚本所在路径,[index : ]截取从index开始后面的字符串
print path1 #输出结果为 C:\Users\ramos-cs\Desktop\monkeyrunner
path2=path1 +"\\"+ datetime.now().strftime('%Y-%m-%d-%H-%M-%S')+".png"
print path2#输出结果为 C:\Users\ramos-cs\Desktop\monkeyrunner\2015-09-14-11-30-45.png
'''
img1.writeToFile(path2,"png")#path2:完全合法的文件名和输出格式的扩展名后缀; "png" 文件输出格式
subimg.writeToFile(path2,"png")#writeToFile()


附 MonkeyImag官方API文档:http://www.android-doc.com/tools/help/MonkeyImage.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: