zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }

     

  • 相关阅读:
    NSUserDefaults
    版本控制
    真机调试流程
    UIImageView加载图片的两种方式
    UI控件之--UIButton
    Xcode错误总结
    自动布局AutoLayout
    地理编码和反地理编码
    WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞
    WordPress RokMicroNews插件‘thumb.php’ 多个安全漏洞
  • 原文地址:https://www.cnblogs.com/94xiyang/p/9407544.html
Copyright © 2011-2022 走看看