您的位置:首页 > 产品设计 > UI/UE

14.Android UiAutomator 图像处理

2016-02-28 19:09 441 查看

一、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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: