一、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. Python 代码调试技巧

    使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变 ...

  2. psp项目计划

    日期/任务 听课 编写程序 阅读书籍 查阅资料 日总计 周一 2h 0.5h     2.5 周二     1h   1 周三     1h     周四 2h 0.5h     2.5 周五   3 ...

  3. Python:字典操作总结

     字典是Python中唯一的映射类型 [注]:字典中数据是无序排放的 一.字典的创建方法 方法1:用大括号包裹键值对从而创建字典 addict={}#创建一个空字典 addict={key1:valu ...

  4. JAVA方法的重载(overload)和覆盖(override)

    方法的重载(overload)和覆盖(override) 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println() ...

  5. nginx 二进制安装

    Nginx的安装方法 1:yum安装 默认是1.6版本,且在epel源中   2:源码包编译安装 源码下载:http://nginx.org/en/download.html,下载1.8稳定版本   ...

  6. 可以从Jar外部加载JDBC.properties的Spring-mybatis配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. jdbc 小结

    1,PreparedStatement/Statement区别: 1,防止sql注入式攻击(sql注入:就是通过非正常手段(比如在url中添加参数)),将sql文执行(比如or 1=1) 2,Prep ...

  8. 以太网帧,IP,TCP,UDP首部结构

    1.以太网帧的格式 以太网封装格式 2.IP报头格式 IP是TCP/IP协议簇中最为重要的协议.所有的TCP,UDP, ICMP和IGMP数据都以IP数据报格式传输.IP提供的是不可靠.无连接的协议. ...

  9. DRM Study

    1.DRM是什么? DRM,英文全称Digital Rights Management, 可以翻译为:数字版权管理.指的是出版者用来控制被保护对象的使用权的一些技术,这些技术保护的有数字化内容(例如: ...

  10. Java实现Websocket

    Websocket介绍 在一个 WebSocket应用中, 服务器发布一个 WebSocket端点, 客户端使用这个端点的URI来连接服务器.建立连接之后,websocket协议是对称的;客户端和服务 ...