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

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. ASP.NET Web API中的路由

    ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...

  2. Django之前端模板继承

    在使用Django进行web开发时,往往会构造一个基础框架模板即base.html,而后在其子模板中对它所包含站点公用部分和定义块进行重载. 首先创建一个base.html,源码为: <!DOC ...

  3. 使用HTML5构建iOS原生APP(2)

    本文转载至 http://ju.outofmemory.cn/entry/18807 有时候我们在内嵌的webview中希望点击一个链接之后,触发iOS原生事件,而不是webview内页面跳转(因为w ...

  4. hdu2469(计算几何)

    枚举所有可能的半径,然后将所有满足这个半径的点按角度(与x轴正半轴的夹角)排序. 然后一遍扫描求出在这个半径下选k个点所需的最小面积 . 思路还是比较简单,实现略有些繁琐. 要先将点的坐标转换为角度. ...

  5. resin配置

    第一种方式:      在本机调试Resin服务,一般是在Eclipse IDE中进行,这样即可以快速的在开发环境中启动/终止Resin,又可以很方便的Debug程序.跟踪异常栈.    在任何版本的 ...

  6. [hihoCoder] Trie树

    This is a application of the Trie data structure, with minor extension. The critical part in this pr ...

  7. [Algorithms] Heap and Heapsort

    Recently I reviewed the classic heapsort algorithm and implement it according to contents in Introdu ...

  8. text-align:justify 使用参考

    对 text-align:justify 不大了解的,可以先看这里:从css text-align:justify 谈谈 text-align 文本对齐方式,讲的比较浅显易懂,本篇相对深入些,最好先看 ...

  9. 《JAVA多线程编程核心技术》 笔记:第六章:单例模式与多线程

    一.立即加载/"饿汉模式"和延迟加载/"懒汉模式" 立即加载(又称饿汉模式):在使用类的时候已经将对象创建完毕,常见实现方法是直接new实例化 延迟加载(又称懒 ...

  10. 解决Object() takes on paramenters的问题

    先贴上今天的代码: 解决:是由于父类中的_init_()写成了_int_(),由于粗心导致,下次注意.