一、BitMap介绍

1.图像使用场景

1)效果类截图
2)不可见的组件图像对比
3)失败与异常截图
4)利用图像判断组件

2.部分API简单说明

API

说明

compress 压缩图片
copy 复制图片
createBitmap 创建图片
getHeight 获取图片高度
getWidth 获取图片宽度
getPixel 获取某个点颜色值
setPixel 设置某个点颜色值

3.创建bitmap实例

//方法体代码
public class ImageTestCase extends UiAutomatorTestCase{
public void saveBitMapToSdcard(Bitmap bitmap,String newName){
FileOutputStream out=null;
try {
out=new FileOutputStream("/mnt/sdcard/"+newName+".jpg");
if(out!=null){
//三个参数分别为格式、保存的文件质量、文件流
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} //用例部分代码
public class test1 extends ImageTestCase{
//快速调试
public static void main(String [] args){
new UiAutomatorHelper("test","testDemo1.test1","testDemo1","2");
}
//创建一个Bitmap
public void testDemo1(){
//a.截取一张图片
String Path="/mnt/sdcard/testBitMap.png";
File storePath=new File(Path);
UiDevice.getInstance().takeScreenshot(storePath);
sleep(1000);
//b.将图片重命名并保存
//从文件中创建bitmap
Bitmap bitmap=BitmapFactory.decodeFile(Path);
//调用方法体
saveBitMapToSdcard(bitmap,"new-Image-88");
}
}

二、获取像素值与图像截取

像素值:每一个像素点的颜色值

1.获取某点像素值实例
//方法体代码
public class ImageTestCase extends UiAutomatorTestCase{
//根据描述获取组件
public UiObject obj(String text){
return new UiObject(new UiSelector().description(text));
}
//截取一张图片后另存
public void cutBitmap(Rect rect,String path){
Bitmap m=BitmapFactory.decodeFile(path);
m=m.createBitmap(m,rect.left,rect.top,rect.width(),rect.height());
//调用上面例子中的那个方法,实际调试过程中如果需要就把那个方法体加上
saveBitMapToSdcard(m, "cutImg_88");
}
//获取某点的颜色值
public int getColorPicel(int x,int y){
String path="/mnt/sdcard/testcolor.png";
File file=new File(path);
UiDevice.getInstance().takeScreenshot(file);
Bitmap m=BitmapFactory.decodeFile(path);
int color=m.getPixel(x, y);
return color;
}
} //用例代码
public class test1 extends ImageTestCase{
//快速调试
public static void main(String [] args){
new UiAutomatorHelper("test","testDemo1.test1","testDemo2","2");
}
//用例
public void testDemo2() throws UiObjectNotFoundException{
//截取图片
Rect rect = obj("城市").getBounds();
String path="/mnt/sdcard/testcolor.png";
File file=new File(path);
UiDevice.getInstance().takeScreenshot(file);
//调用方法体
cutBitmap(rect,path);
//调用方法体获取某个点的颜色值
int color=getColorPicel(rect.centerX(),rect.centerY());
System.out.println("COLOR:"+color);
}
}

三、图像嵌入文字

截图的时候希望把用例场景用文字写在图像上,便于快速查看

1.图像嵌入文字实例:
//方法体
public class ImageTestCase extends UiAutomatorTestCase{
//截图方法
public void screenshotAndDrawRext(String path,String imageName,String text){
File file=new File(path);
UiDevice.getInstance().takeScreenshot(file);
Bitmap bitmap=BitmapFactory.decodeFile(path);
Bitmap drawBitmap=drawTextBitmap(bitmap,text);
saveBitMapToSdcard(drawBitmap, imageName);//调用前面第一个例子中的方法
}
//嵌入文字方法
public Bitmap drawTextBitmap(Bitmap bitmap,String text){
int x=bitmap.getWidth();
int y=bitmap.getHeight();
//创建一个更大的位图
Bitmap newBitmap=Bitmap.createBitmap(x,y+80,Bitmap.Config.ARGB_8888);
Canvas canvans=new Canvas(newBitmap);
Paint paint=new Paint();
//在原图位置(0,0)叠加一张图片
canvans.drawBitmap(bitmap, 0, 0,paint);
//画笔眼色
paint.setColor(Color.parseColor("#FF0000"));
paint.setTextSize(80);//设置文字大小
canvans.drawText(text, 300, y+55, paint);//写字
canvans.save(Canvas.ALL_SAVE_FLAG);//保存
canvans.restore();
return newBitmap;
}
} //用例
public class test1 extends ImageTestCase{
//快速调试
public static void main(String [] args){
new UiAutomatorHelper("test","testDemo1.test1","testDemo3","2");
}
public void testDemo3(){
String path="/mnt/sdcard/testDrawText.png";
String imageName="testDrawText_888";
String text="测试输入";
//调用方法体
screenshotAndDrawRext(path, imageName, text);
}
}

四、图像对比

某些特殊组件无法获取到组件信息,无法判断状态

1.图像对比实例
//方法体
public class ImageTestCase extends UiAutomatorTestCase{
//图像对比的方法
public boolean imageSameAs(String targetImagePath,String comPath,double percent){
try {
//创建两个bitmap
Bitmap m1=BitmapFactory.decodeFile(targetImagePath);
Bitmap m2=BitmapFactory.decodeFile(comPath);
//声明变量
int width=m2.getWidth();
int height=m2.getHeight();
int numDiffPixels=0;
//横纵对比,涉及到两个循环
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
//取不相等的像素值
if(m2.getPixel(x, y)!=m1.getPixel(x, y)){
numDiffPixels++;
}
}
}
double totalPices=height*width;//总像素值
double diffPercent=numDiffPixels/totalPices;//不相等的百分比
return percent<=1.0-diffPercent;//返回相似度
} catch (Exception e) {
}
return false;
}
} //图片对比用例部分
public class test1 extends ImageTestCase{
//快速调试
public static void main(String [] args){
new UiAutomatorHelper("test","testDemo1.test1","testDemo4","2");
}
//图片对比
public void testDemo4(){
//截取两张对比图
String targetImagePath="/mnt/sdcard/c1.png";
String comPath="/mnt/sdcard/c2.png";
File f1=new File(targetImagePath);
File f2=new File(comPath);
UiDevice.getInstance().takeScreenshot(f1);
sleep(1000);
UiDevice.getInstance().pressHome();//换个场景
sleep(1000);
UiDevice.getInstance().takeScreenshot(f2);
//调用图像对比方法
boolean b=imageSameAs(targetImagePath,comPath,1.0d);
//输出对比结果
System.out.println("图像比对结果:"+b);
}
}

14.Android UiAutomator 图像处理的更多相关文章

  1. Android uiautomator gradle build system

    This will guide you through the steps to write your first uiautomator test using gradle as it build ...

  2. Android UiAutomator 自动化测试编译运行---新手2

    1.首先打开eclipse创建java项目

  3. Appium python自动化测试系列之Android UIAutomator终极定位(七)

    android uiautomator text定位 可能有人不知道为什么说android uiautomator是终极定位,而且android uiautomator和appium有什么关系呢?如果 ...

  4. Android UiAutomator - CTS Frame

    使用UiAutomator进行UI自动化测试后,生成的测试结果并不是很美观.为了生成一份好看的测试结果(报告),本文将使用CTS框架,当然也可以自己编写一份测试报告框架(如:生成html,excel报 ...

  5. Android UiAutomator 快速调试

    背景:在Eclipse中不能直接运行Uiautomator工程,所以每次编写一份用例都要进行手动输入命令,很烦.调试起来不仅繁琐还浪费时间.网上找到一份快速调试的代码UiAutomatorHelper ...

  6. Android UiAutomator

    UiAutomator是一个做UI测试的自动化框架.<Android自动化测试框架>中已有详细介绍,这里就不再累赘了. 一.首先了解自动化测试流程 自动化需求分析 测试用例设计 自动化框架 ...

  7. python+Android+uiautomator的环境

    Python+Android+uiautomator的环境搭建 Python 下载适合系统的版本并安装,安装时勾选把路径加入path 验证:windows下打开cmd输入python 出现以下界面说明 ...

  8. Appium+python自动化(十二)- Android UIAutomator终极定位凶“胸”器(七)(超详解)

    简介 乍眼一看,小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了,其实不然,上次介绍和分享的大哥是uiautomatorviewer,是一款定位工具.今天介绍的是一个java库,提供执行自动化测 ...

  9. Android uiautomator实例使用

    转载自:http://blog.csdn.net/huiguixian/article/details/22398193 Android测试工具中,Monkey Runner只要简单几个指令即可,但他 ...

随机推荐

  1. CF刷刷水题找自信1

    CF 1108A Two distinct points 题目意思:给你两个线段的起点和终点,让你给出两个不同的点,这两点分别处于两个不同的线段之中.解题思路:题目说如果存在多种可能的点,随意一组答案 ...

  2. Easy ui DateBox 控件格式化显示操作

    //Easy ui datebox 控件 <input class="easyui-datebox" name="StartTime" id=" ...

  3. DNS测试工具的使用(了解)

    dig命令, host命令, nslookup命令,rndc命令 dig命令(直接测试DNS性能,不会查询/etc/hosts文件) dig [-t RR_TYPE] name [@SERVER] [ ...

  4. 1st 英文文章词频统计

    英文文章词频统计: 功能:统计一篇英文文章的单词总数及出现频数并输出,之后排序,输出频数前十的单词及其频数. 实现方法:使用C语言,用fopen函数读入txt文件,fscanf函数逐个读入单词,结构体 ...

  5. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  6. vue ui components

    vue ui components h_ui https://www.npmjs.com/~hs_ui https://www.npmjs.com/package/h_ui_beta https:// ...

  7. Kafka在大型应用中的 20 项最佳实践

    原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...

  8. postman md5加密 然后传给下一个接口作为参数调用

    https://www.v2ex.com/api/nodes/show.json?name=python get请求 断言: tests["Body matches string" ...

  9. 【bzoj3125】CITY 插头dp

    题目描述 给出一个n*m的矩阵,某些格子不能通过,某些格子只能上下通过或左右通过.求经过所有非不能通过格子的哈密顿回路条数. 输入 第一行有两个数N, M表示地图被分割成N*M个块,接下来有N行,每行 ...

  10. Infinity NaN undefined和null

    Infinity属性用于存放表示正无穷大的数值. 负无穷大是表示负无穷大一个数字值. 该属性为Global对象的一个只读属性, 所有主流浏览器均支持该属性. Infinity属性的值为Number类型 ...