14.Android UiAutomator 图像处理

一、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);
    }
}
原文地址:https://www.cnblogs.com/JianXu/p/5225365.html