zoukankan      html  css  js  c++  java
  • uiautomator--图像处理

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

    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;
        }
            
    }
     
  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/WXBai/p/6293368.html
Copyright © 2011-2022 走看看