Script 1.8.0

seekImage 的使用方法

在线阅读
下载PDF文档

首先需要说明的是:目前我们支持的图像格式包括:BMP, PNG, JPEG等,但由于BMP和PNG格式的图像保存了最完整的信息,所以我们希望用户使用这两个格式的图像作为搜索图像。至于JPEG等格式,由于其数据压缩的算法不同,导致图像或多或少的失真,这在图像搜索时,往往会产生意想不到的结果,从而导致无法找到正确的坐标。
当前我们提供八种方式使用 seekImage,分别为:

直接输入目标图绝对路径方式(采用缺省相似度)

函数原型

Coord seekImage(String imageName)

在手机全屏范围内,搜索指定图像
@param imageName: 图像绝对路径
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

示例
	var ret = device.seekImage("E:/Temp/7/aa/1.png");
	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);
说明

在上例中,seekImage 仅需要一个参数,即搜索目标图像在电脑中的存储位置
此外,需要说明的是:该函数为相似搜索,使用缺省的相似度为0.7。

注意

    凡seekImage族函数,如不指定相似度,均为相似搜索,使用的相似度为缺省相似度0.7

注意


凡seekImage族函数,均支持对手机屏幕的缩放。即:
如果您的手机屏幕分辨率为1440*2560,而您要在手机屏幕上搜缩的小图是在 720*1280 上截取的,那么,所有seekImage族函数会将屏幕自动缩放后,再进行搜索。
也就是说,您所使用的小图,无须在相同分辨率的手机上获取,也能够在该手机上搜到。
当然,这种自动缩放后的搜索均为相似搜索,所以其相似度必须小于1。若将相似度显式指定为1,则为相同搜索。一般地,相似度越小,搜索的相似要求也越低;如果您将相似度显示指定为0,那么,seekImage族函数会给你一个它认为最相似的区域,当然,这个区域在人类的肉眼看来,可见完全不相同。
关于相似度的设置,请参考下一节。

直接输入目标图绝对路径方式(指定相似度)

函数原型

Coord seekImage(String imageName, float sim)

@param imageName: 图像绝对路径
@param sim: 相似度
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

示例
	var ret = device.seekImage("E:/Temp/7/aa/1.png“, 1.0);
	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);
说明

    本函数与上一函数惟一的区别就是:显示地指定了搜索相似度。其取值范围为[0.0, 1.0]。
相似度为1,则要求屏幕上的图像与输入的图像完全相同。
相似度为0,则seekImage函数总会返回一个坐标,该坐标为与输入图像最相似屏幕区域的中心位置。

注意

    由于不仅是手机的分辨率会影响屏幕上的图像,手机的生产商、风格设定、字体设置等,都可能影响屏幕上对象的显示,即便是分辨率同为 720*1280 的手机,同一个应用程序的相同界面,在细节上都有可能不同。对于分辨率不同的手机,在缩放以后,其图像尤其会产生差异。
出于人性化的考虑,同时也避免客户准备过多的搜索目标小图,我们引入了相似度这个参数。
如果您不知道相似度具体应该设为多大的值,那么在此提供一些相似度的设置经验:
相似度主要用于相似查找,如果你要进行完全相同图像的查找,那么可以简单地将相似度设为1.0。 如果您要进行相似查找,并且已经知道手机屏幕上一定存在与您要找图像相似的区域,只是不知道该区域在哪里,那么不妨将相似度设为 0,seekImage会返回与要找的图最相似的区域中心坐标。
如果您要进行相似查找,但又不知道手机屏幕上是否有您需要的图像,那么您必须先进行试验,在某个既定的手机屏幕上调用该函数,分别将相似度设为不同的值,检测哪个值能得到正确的结果。这个过程其实并不复杂,通常而言只要花两三分钟就能得结果。而且,考虑到您采用的图像,无需修改就能应用到不同的手机上,这点付出还是值得的。

指定搜索区域进行查找(采用缺省相似度)

函数原型

Coord seekImage( int topLeftX, int topLeftY, int bottomRightX, int bottomRightY, String imageName)

在指定的手机屏幕范围内,搜索指定图像
@param topLeftX: 手机屏幕上,搜索范围的左上角X坐标,注意,这是脚本坐标。关于什么是脚本坐标,请参考后面的详细说明
@param topLeftY: 手机屏幕上,搜索范围的左上角Y坐标,注意,这是脚本坐标。
@param bottomRightX: 手机屏幕上,搜索范围的右下角X坐标,注意,这是脚本坐标。
@param bottomRightY: 手机屏幕上,搜索范围的右下角Y坐标,注意,这是脚本坐标。
@param imageName: 图像绝对路径
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

示例
	var ret = device.seekImage(0, 0, 719, 1279, "E:/Temp/7/aa/1.png");
	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);
说明

相较于第一个seekImage函数,在上例中,seekImage 多出了四个参数,这四个参数确定在手机屏幕上的矩形范围。seekImage仅会在该矩形范围内搜索图像。

注意


凡seekImage族函数所使用的坐标,均为脚本坐标。
什么是脚本坐标?
我们知道,在TC中运行的脚本,都有关于resolution的定义,就象下面这样:

	define("resolution", "720*1280");

    上面这句话显式地定义了手机屏幕的宽度为720像素,高度为1280像素,这就是脚本坐标系统。在这个脚本坐标系统中,所有的有效坐标的X坐标均在区间[0, 719],Y坐标均在区间[0, 1279]。在这个脚本中,一旦出现在此范围外的坐标,均认为是无效坐标。正是因为这个原因,所以seekImage标注矩形区域范围的四个值,均必须满足脚本坐标的约束条件,也就是说,它们必须在指定的范围之内。
然而,脚本中resolution定义为720*1280的脚本,可以在其余分辨率的手机,例如分辨率为1440*2560手手机上执行么?答案是可以的。
脚本中的分辨率720*1280为脚本坐标系统,实际手机的分辨率为物理坐标系统,TC可以自动将脚本坐标转换为实际的物理坐标。也就是说,脚本中的seekImage函数在具体应用于不同的手机时,会自动将指定的矩形范围进行缩放后再进行搜索。


指定搜索区域进行查找(指定相似度)

函数原型

Coord seekImage( int topLeftX, int topLeftY, int bottomRightX, int bottomRightY, string imageName, float sim)

在指定的手机屏幕范围内,搜索指定图像
@param topLeftX: 手机屏幕上,搜索范围的左上角X坐标,注意,这是脚本坐标。关于什么是脚本坐标,请参考后面的详细说明
@param topLeftY: 手机屏幕上,搜索范围的左上角Y坐标,注意,这是脚本坐标。
@param bottomRightX: 手机屏幕上,搜索范围的右下角X坐标,注意,这是脚本坐标。
@param bottomRightY: 手机屏幕上,搜索范围的右下角Y坐标,注意,这是脚本坐标。
@param imageName: 图像绝对路径
@param sim: 相似度,取值范围为[0,1]。1表示图像完全匹配。该值越小,对相似度的要求也越低。如果为0,则该函数返回值为与搜索图最相似区域的中心坐标。
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

示例
	var ret = device.seekImage(0, 0, 719, 1279, "E:/Temp/7/aa/1.png", 1.0);
	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);
说明

相较于上一个seekImage函数,在此例中,seekImage 只是多出了一个相似度参数。关于相似度,在前面我们已有说明,此处不再赘述。

通过ImageInfo搜索图像(采用缺省相似度)

函数原型


    Coord seekImage(ImageInfo imageInfo)

    在手机屏幕的指定矩形范围内,搜索指定图像
@param imageInfo: 图像信息,其成员见下面的示例
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

事实上这个函数与“直接输入搜索范围和目标图绝对路径方式”有相似之处,只是这种方式更接近于面向对象的编程风格。关于这点,请参考后面的示例。

示例
	var imageInfo = newImageInfo();

	imageInfo.imagePath="E:\\Temp\\720s.bmp";
	imageInfo.x=3;
	imageInfo.y=3;
	imageInfo.width=device.script_x-10;
	imageInfo.height=device.script_y -10;
	imageInfo.srcResolutionX=720;
	imageInfo.srcResolutionY=1280;

	var ret = device.seekImage(imageInfo);

	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);

通过ImageInfo搜索图像(指定相似度)

函数原型

    Coord seekImage(ImageInfo imageInfo, float sim)

    在手机屏幕的指定矩形范围内,搜索指定图像
@param imageInfo: 图像信息,其成员见下面的示例
@param sim: 相似度,取值范围为[0,1]。1表示图像完全匹配。该值越小,对相似度的要求也越低。如果为0,则该函数返回值为与搜索图最相似区域的中心坐标。
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

事实上这个函数与上一个函数相比,仅是显式地指出了相似度的值。

示例
	var imageInfo = newImageInfo();

	imageInfo.imagePath="E:\\Temp\\720s.bmp";
	imageInfo.x=3;
	imageInfo.y=3;
	imageInfo.width=device.script_x-10;
	imageInfo.height=device.script_y -10;
	imageInfo.srcResolutionX=720;
	imageInfo.srcResolutionY=1280;

	var ret = device.seekImage(imageInfo, 1.0);

	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);

通过配置文件与 ImageID 方式(采用缺省相似度)

函数原型

    Coord seekImageByID (String imageID)

    在手机屏幕的指定矩形范围内,搜索指定图像,支持缩放
@param imageID: 图像ID
@return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

准备工作

    请在“我的文档”中准备文件{Documents}\resources\images\image_mapping.json。

内容如下:

{
	'IDMapImageFile':
	[
		{'ID':'juhuasuan', APP:'weixin', REGION: {x:0, y:0, width:719, height: 1279, srcResolutionX: 720, srcResolutionY: 1280}, IMAGEFILENAME:'jianghu.bmp'},
		{'ID':'AAA', APP:'weixin', REGION: {x:0, y:0, width:1440, height: 2560, srcResolutionX: 1440, srcResolutionY: 2560}, IMAGEFILENAME:'1440small.png'}
	]
}

image_mapping.json的作用就是把要输入到seekImage函数里的参数,预定义在配置文件中。 固定格式封装:

{
	'IDMapImageFile':
	[
		…
	]
}

每个条目固定格式:

	{'ID':'juhuasuan', APP:'weixin', REGION: {x:0, y:0, width:719, height: 1279, srcResolutionX: 720, srcResolutionY: 1280},
ID: 图像ID,用户自定义
APP: 该图标所在应用程序,事实上是一个子路径,存放在“{Documents}\resources\images\”路径中,用于存放图像
REGION:
	后两个参数srcResolutionX, srcResolutionY为指定的手机分辨率;
	前四个参数x, y, width, height为该分辨率手机屏幕上的搜图范围。
	如果实际操作的手机分辨率不为srcResolutionX*srcResolutionY,那么x, y, width, height会自动根据实际分辨率进行缩放
IMAGEFILENAME:图像文件


示例
	var ret = device.seekImageByID("juhuasuan");

	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);

通过配置文件与 ImageID 方式(指定相似度)

函数原型

    Coord seekImageByID (String imageID, float sim)

    在手机屏幕的指定矩形范围内,搜索指定图像,支持缩放
@param imageID: 图像ID
@param sim: 相似度,取值范围为[0,1]。1表示图像完全匹配。该值越小,对相似度的要求也越低。如果为0,则该函数返回值为与搜索图最相似区域的中心坐标。 @return 该图像中心位置在手机屏幕上的坐标,可用其分量x,y获取

    本函数与上一函数的惟一区别即参数相似度sim,关于此点无需赘述。

示例
	var ret = device.seekImageByID("juhuasuan", 1.0);

	print("Last Error: " + lastError());
	print("Center X: " + ret.x);
	print("Center Y: " + ret.y);