本内容主要实现了以下功能:
- 圆形相机预览框
- FaceDetector人脸识别检测
- 截取图片中的人脸图片(宽高自定义)
- 圆形图片显示
效果图:
以下只说了大致的实现思路和核心入口代码,详情见demo(文末奉上)
1、圆形相机预览
自定义CircleCameraLayout类,自定义一个轮廓提供者裁剪一个圆形,在定义一个相机预览CameraPreview,然后把CameraPreview到CircleCameraLayout中。
2、FaceDetector人脸识别检测
通过实现Camera.PreviewCallback的方法拿到bytes数组,转为RGB_565的bitmap,然后对bitmap进行检测,代码如下
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
Log.d(TAG, "onPreviewFrame:" + camera);
if (System.currentTimeMillis() - lastModirTime <= 200 || bytes == null || bytes.length == 0) {
return;
}
face(bytes, camera);
lastModirTime = System.currentTimeMillis();
}
private void face(byte[] bytes, Camera camera) {
Camera.Size size = camera.getParameters().getPreviewSize();
YuvImage image = new YuvImage(bytes, ImageFormat.NV21, size.width, size.height, null);
if (image != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
Matrix matrix = new Matrix();
matrix.reset();
matrix.setRotate(-90);
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
Bitmap bitmap = bmp.copy(Bitmap.Config.RGB_565, true);
//开始检测 当faces 说明检测到人脸了。
FaceDetector faceDetector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 1);
FaceDetector.Face[] face = new FaceDetector.Face[1];
int faces = faceDetector.findFaces(bitmap, face);
if (faces > 0) {
Log.d(TAG, "onPreviewFrame检测到人脸");
}
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、截取图片中的人脸图片
我们可以通过FaceHelper类对检测到有人脸的bitmap进行人脸截取就能拿到位于人脸区域的图片。
Bitmap faceBitmap = FaceHelper.genFaceBitmap(bitmap);//得到截取后的bitmap
在FaceHelper类中的genFaceBitmap方法中的最后几行中的下面这行的代码进行宽高截取,我这里写的是宽为480,高自适应。
final Bitmap result = Bitmap.createBitmap(cacheBitmap, startX, startY, 480, height);
4、圆形图片显示
主要是通过自定义CircleImageView得到了一个圆形的imageview。
最后记得添加相机聚焦等相关权限。