• 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);
        }
    }
  • 相关阅读:
    js实现好看的图案 加勒比海盗(php拍黄片)
    网站优化的几点 下
    php算法 快速排序 选择算法 冒泡算法
    javascript中null和undefined的区别
    tp3 上传图片出现上传根目录不存在!请尝试手动创建:./Public/Uploads/ 错误解决思路
    网站优化的几点 上
    tp5框架 报错非法请求:admin/index/index
    通过response向服务器用Io流写入图片
    解决客户端向服务器写中文时乱码问题
    setInterval()设置页面5,4,3,2,1秒后跳转
  • 原文地址:https://www.cnblogs.com/JianXu/p/5225365.html
Copyright © 2020-2023  润新知