一、图像处理在自动化中使用场景

1)效果类截图 
图像处理技术在自动化的场景中很容易使用到。自动化不是万能的,有时候效果类的是无法进行验证的,但是效果类一般会有图像显示,我们可以通过截图对比实现。
2)不可见的组件图像对比 
uiautomator依赖于组件的可见性,组件不可见的时候,那组件里的信息也是不可读到的,类似ImgButton,它的状态一旦变化,我们就没有办法判断,这种可以使用图像进行对比。
3)失败与异常截图 
还有时候,用例运行失败,我们想知道失败的时候场景是怎么样子的,就需要失败异常的截图。
4)利用图像判断组件
有时候,有些组件,比如播放键,播放与暂停是用图片代替的, 这时候我们不能获取组件信息,这时候我们就可以用图像对比来获取信息。

二、BitMap图像处理

1.部分API简单说明

  BitMap给我们提供很多图片的处理方法。

  这边简单的列了一些API
API 说明
compress 压缩图片
copy 复制图片
createBitmap 创建图片
getHeight 获取图片高度
getWidth 获取图片宽度
getPixel 获取某个点颜色值
setPixel 设置某个点颜色值

三、图像处理实例

package com.yoyo.testsuites;

import java.lang.Exception;

import java.io.File;
import java.io.FileOutputStream; import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect; public class bitmapBase extends UiAutomatorTestCase {
//快速调试
public static void main(String[] args) {
String jarName = "TestYoyo";
String testClass = "com.yoyo.testsuites.bitmapBase";
String testName = "runTest";
String androidId = "5";
new UiAutomatorHelper(jarName, testClass, testName, androidId);
} UiDevice device = UiDevice.getInstance(); //用例
public void runTest() throws UiObjectNotFoundException { //创建bitmap
crateBitmap("bitmap"); //截取组件图片
UiObject object=new UiObject(new UiSelector().resourceId("dianyun.baobaowd:id/checkin_iv"));
cutImg(object,"screenshot","checkinImg"); //获取截图中(100,200)坐标位置的颜色值
int colorValue=getColor(100,200,"ColorImg");
System.out.println("该坐标点的颜色值为="+colorValue); //截图并嵌入文字
scrennshotAndDrawnText("screenshot","textImg", "截图并嵌入文字"); //截取组件,与保存的组件原图进行对比
UiObject object2 =new UiObject(new UiSelector().resourceId("dianyun.baobaowd:id/checkin_iv"));
cutImg(object2, "screenshot", "moduleImg");//截取组件图
String targetImgPath="mnt/sdcard/yoyoTargetImg/checkImg.jpg";//已保存将用来做对比的截图
String comPath="mnt/sdcard/yoyoTest/moduleImg.jpg";
double percent=0.9;
//调用图像对比方法
boolean b=imgSameAs(targetImgPath,comPath,percent);
//输出对比结果
System.out.println("图像比对结果:"+b);
} /*-------------------图像处理方法---------------------*/ //创建bitmap
public void crateBitmap(String ImgName) {
//截取一张图片
String path="mnt/sdcard/yoyoTest/takescreenshot.jpg";
File file=new File(path);
device.takeScreenshot(file);
sleep(1000);
//将图片重命名保存
//先将截图通过BitmapFactory(bitmap工厂模式)创建为bitmap,然后将bitmap压缩保存
Bitmap bitmap=BitmapFactory.decodeFile(path);
saveBitMapToSdcard(bitmap,ImgName);
} //压缩保存bitmap图
public void saveBitMapToSdcard(Bitmap bitmap,String ImgName){
FileOutputStream out=null;
try {
out=new FileOutputStream("/mnt/sdcard/yoyoTest/"+ImgName+".jpg");
if(out!=null){
//三个参数分别为格式、保存的文件质量90为原图的90%、文件流
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} //组件区域截图
//object:组件的object
public void cutImg(Object object,String screenshotName,String moduleImgName) throws UiObjectNotFoundException {
//截取图片并保存至path
String path="/mnt/sdcard/yoyoTest/"+screenshotName+".png";
File file=new File(path);
UiDevice.getInstance().takeScreenshot(file);
//根据path路径找到截图,截取组件图
Bitmap m=BitmapFactory.decodeFile(path);
Rect rect = ((UiObject) object).getBounds();
m=Bitmap.createBitmap(m,rect.left,rect.top,rect.width(),rect.height());
//保存组件截图
saveBitMapToSdcard(m, moduleImgName);
} //获取某一点的颜色值
public int getColor(int x,int y,String ImgName) {
String path="/mnt/sdcard/yoyoTest/"+ImgName+".jpg";
File file =new File(path);
device.takeScreenshot(file);
Bitmap bitmap=BitmapFactory.decodeFile(path);
int color=bitmap.getPixel(x,y);
System.out.println(color);
return color;
} //图像嵌入文字
public void scrennshotAndDrawnText(String screenshotName,String textImgName,String text) {
String path="/mnt/sdcard/yoyoTest/"+screenshotName+".jpg";
File file =new File(path);
device.takeScreenshot(file);
Bitmap bitmap=BitmapFactory.decodeFile(path);
Bitmap drawBitmap=drawTextBitmap(bitmap,text);
saveBitMapToSdcard(drawBitmap, textImgName);//调用嵌入文字方法
} //嵌入文字方法
private Bitmap drawTextBitmap(Bitmap bitmap, String text) {
int x=bitmap.getWidth();
int y=bitmap.getHeight();
///创建一个更大的位图,Config.ARGB_8888为创建的位图的信息,32位
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 boolean imgSameAs(String targetImgPath,String comPath,double percent) {
try {
//创建两个bitmap
Bitmap targetImg=BitmapFactory.decodeFile(targetImgPath);
Bitmap compareImg=BitmapFactory.decodeFile(comPath);
//声明变量
int width=compareImg.getWidth();
int height=compareImg.getHeight();
int numDiffPixels=0;//两张图片像素差
for (int y= 0; y< height ;y++) {
for(int x=0;x<width;x++){
//取不相等的像素值
if (compareImg.getPixel(x, y)!=targetImg.getPixel(x, y)) {
numDiffPixels++;
}
}
}
double totalPixels=width*height;//像素值总量=width*height
double diffPercent=numDiffPixels/totalPixels;//差异度百分比=不等像素值/像素值总量
System.out.println(1.0-diffPercent);//相似度百分比=1.0-差异度百分比
return percent<=1.0-diffPercent; } catch (Exception e) {
} return false;
} }
 

uiautomator--图像处理的更多相关文章

  1. 14.Android UiAutomator 图像处理

    一.BitMap介绍 1.图像使用场景 1)效果类截图 2)不可见的组件图像对比 3)失败与异常截图 4)利用图像判断组件 2.部分API简单说明 API 说明 compress 压缩图片 copy ...

  2. Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉

    Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉 1.1. 按照当前流行的分类方法,可以分为以下三部分:三部分 图像处理 图像分析 计算机视觉1 1.2. 图像处理需要 ...

  3. Atitit 图像处理的摩西五经attilax总结

    Atitit 图像处理的摩西五经attilax总结 1. 数字图像处理(第三版)1 2. 图像处理基础(第2版)(世界著名计算机教材精选)1 3. 计算机视觉特征提取与图像处理(第三版)2 4. Op ...

  4. Atitit 图像处理的心得与疑惑 attilax总结

    Atitit 图像处理的心得与疑惑 attilax总结 1.1. 使用类库好不好??还是自己实现算法1 1.2. 但是,如果遇到类库体积太大,后者没有合适的算法,那就只能自己开发算法了1 1.3. 如 ...

  5. Atitit 图像处理 调用opencv 通过java  api   attilax总结

    Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...

  6. Atitit MATLAB 图像处理 经典书籍attilax总结

    Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...

  7. Atitit 图像处理类库大总结attilax qc20

    Atitit 图像处理类库大总结attilax qc20 1.1. 选择与组合不同的图像处理类库1 1.2. Halcon 貌似商业工具,功能强大.1 1.3. Openvc  Openvc功能也是比 ...

  8. Atitit MATLAB 图像处理attilax总结

    Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...

  9. 使用MATLAB对图像处理的几种方法(下)

     试验报告 一.试验原理: 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对 ...

  10. 使用MATLAB对图像处理的几种方法(上)

    实验一图像的滤波处理 一.实验目的 使用MATLAB处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响 ...

随机推荐

  1. MathType编辑钢筋符号就是这么简单

    很多的用户在使用MathType公式编辑器的时候,发现它所包含的符号非常的多,几乎你在数学中看到的任何符号都能用MathType编辑出来.它能够满足各个学科对符号的需求,除了常规的数学物理符号之外,也 ...

  2. Oracle菜鸟之怎样创建和删除表空间

    1.创建暂时表空间 创建表空间时,dbf文件一般存放在datafile文件的存放文件夹下(通常是在实例名命名的文件夹以下) 能够通过 select * from v$datafile;查看全部数据文件 ...

  3. 所有版本chromedriver下载

     所有版本chromedriver下载 http://chromedriver.storage.googleapis.com/index.html

  4. 穿透Session 0 隔离(二)

    上一篇我们已经对Session 0 隔离有了进一步认识,如果在开发过程中确实需要服务与桌面用户进行交互,可以通过远程桌面服务的API 绕过Session 0 的隔离完成交互操作. 对于简单的交互,服务 ...

  5. 下载flv格式视频

    我们再看flash plaer播放视频时,有些时候需要下载,无奈找不到下载的按钮.这时,我们可以用以下的方式来进行下载. 其它格式估计也是有迹可循,大家仔细看看网页源代码,看到类似于这种地址,看到有相 ...

  6. Akka Essentials - 2

    Actors Defining an actor class MyActor extends Actor { def receive = { } } In Scala, the receive blo ...

  7. 2015-03-12——简析DOM2级事件

    DOM2级事件 事件的几种类型:对象事件,鼠标事件,键盘事件,表单事件,W3CDOM事件,以及针对浏览器的事件. 对象事件:window对象,也是javascript对象.load  适用于windo ...

  8. Line---CodeForces 7C(扩展欧几里得算法)

    题目链接:http://codeforces.com/problemset/problem/7/C AX+BY=C已知 A B C 求 X Y: #include <iostream> # ...

  9. 前端html/css/script基础

    1. 基础模板 <!DOCTYPE html> <html> <head> <meta charert="utf-8" /> < ...

  10. 前端(css引入的3中方式)

    一.css引入的三种方式 行间式 在标签头部的style属性内 属性值满足的是css语法 属性值用key:value形式赋值,value具有单位 属性值之间用;隔开 外联式(企业开发中使用这种方式) ...