• Android 裁剪人脸


    人脸裁剪类

    public final class FaceCj {
        private static BitmapFactory.Options BitmapFactoryOptionsbfo;
        private static ByteArrayOutputStream out;
        private static byte[] data;
        private static FaceDetector.Face[] myFace;
        private static FaceDetector myFaceDetect;
        private static int tx = 0;
        private static int ty = 0;
        private static int bx = 0;
        private static int by = 0;
        private static int width = 0;
        private static int height = 0;
        private static float wuchax = 0;
        private static float wuchay = 0;
        private static FaceDetector.Face face;
        private static PointF myMidPoint;
        private static float myEyesDistance;
        private static List<String> facePaths;
        private static String facePath;
        public static Bitmap cutFace(Bitmap bitmap, Context context) {
            facePaths = null;
            BitmapFactoryOptionsbfo = new BitmapFactory.Options();
            BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; // 构造位图生成的参数,必须为565。类名+enum
            out = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
            data = out.toByteArray();
            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
                    BitmapFactoryOptionsbfo);
            try {
                out.flush();
                out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            width = bitmap.getWidth();
            height = bitmap.getHeight();
            myFace = new FaceDetector.Face[5]; // 分配人脸数组空间
            myFaceDetect = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 5);
            int numberOfFaceDetected = myFaceDetect.findFaces(bitmap, myFace);
            if (numberOfFaceDetected <= 0) {// FaceDetector构造实例并解析人脸
                bitmap.recycle();
                return null;
            }
            facePaths = new ArrayList<String>();
            for (int i = 0; i < numberOfFaceDetected; i++) {
                face = myFace[i];
                myMidPoint = new PointF();
                face.getMidPoint(myMidPoint);
                myEyesDistance = face.eyesDistance();   //得到人脸中心点和眼间距离参数,并对每个人脸进行画框
                wuchax = myEyesDistance / 2 + myEyesDistance;
                wuchay = myEyesDistance * 2 / 3 + myEyesDistance;
    
                if (myMidPoint.x - wuchax < 0) {//判断左边是否出界
                    tx = 0;
                } else {
                    tx = (int) (myMidPoint.x - wuchax);
                }
                if (myMidPoint.x + wuchax > width) {//判断右边是否出界
                    bx = width;
                } else {
                    bx = (int) (myMidPoint.x + wuchax);
                }
                if (myMidPoint.y - wuchay < 0) {//判断上边是否出界
                    ty = 0;
                } else {
                    ty = (int) (myMidPoint.y - wuchay);
                }
                if (myMidPoint.y + wuchay > height) {//判断下边是否出界
                    by = height;
                } else {
                    by = (int) (myMidPoint.y + wuchay);
                }
    
                try {
                    return Bitmap.createBitmap(bitmap, tx, ty, bx - tx, by - ty);//这里可以自行调整裁剪宽高
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            bitmap.recycle();
            return bitmap;
        }
    
    }

     

  • 相关阅读:
    TypeScript完全解读(26课时)_2.TypeScript完全解读-基础类型
    Flutter实战视频-移动电商-48.详细页_详情和评论的切换
    Flutter实战视频-移动电商-47.详细页_Flutter_html插件的使用
    TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建
    [Android] The connection to adb is down, and a severe error has occured
    每日一小练——求质数
    C++语言笔记系列之十八——虚函数(1)
    Android 输入管理服务-输入事件向详细应用的分发
    Android技术归档
    C++编写绚丽的界面
  • 原文地址:https://www.cnblogs.com/94xiyang/p/9407544.html
Copyright © 2020-2023  润新知