记录--react native 封装人脸 检测、美颜组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
本组件目前只能用在React Native 的iOS端
本组件来之实际中的开发需求:可以检测并且标记人脸,实现基本的美颜,可进行拍照、换行镜头等基础相机功能。官方组件封装 教程
本文代码:DEMO 运行demo
$ git clone https://github.com/lianglei777/demos.git
$ cd demos
$ git checkout RNFaceDemo
$ cd RNFaceDemo
$ npm install
$ cd ios
$ pod install
如果 pod install 失败,请参考 此文 的 cocoapods 部分。
组件功能
- 人脸标记,返回人脸个数
- 滤镜美颜(基于GPUImage),美颜程度可调节(0~9)
- 相机功能,包括拍照、转换前后镜头,其余相机功能可自行扩展
效果如下图
如何使用
代码文件
- 添加 demo 的 ios 文件夹下的 Camera 到自己项目的 ios 目录下,
- ios中添加相关相机相册权限配置
<key>NSCameraUsageDescription</key>
<string>上传头像时,使用您的相机来拍摄照片</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>保存图片时,使用您的相册来保存照片</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>上传头像时,使用您的相册来获取图片</string>
- js 层使用参考 NativeModule/RNFaceDetectView.js 和 Pages/ComponentBridgeDemo.js
安装GPUImage
Podfile 文件中添加如下内容, 运行 pod install
pod 'GPUImage',:git => 'https://github.com/lianglei777/GPUImage.git'
cmd + b 进行编译,如果遇到以下问题
错误1
解决方法: 按照如下途中点击步骤,添加 libGPUImage.a 文件
错误2
解决方法: Build Settings --》 Library Search Paths ,双击添加 "${PODS_CONFIGURATION_BUILD_DIR}/GPUImage",选择 non-recursive
介绍
代码中已经加了比较多的注释,这里主要根据文件来说一些我觉得要关注的点。
GPUImage
GPUImage 是一款利用GPU添加滤镜效果,美化图像的 Object-C 库,但是可惜的是 swift 出现之后作者放弃维护了,需要修改一些代码才能运行在较新的iOS版本中,这里是我修改之后的 GPUImage 库,也是组件中在用的
FSKGPUImageBeautyFilter
FSKGPUImageBeautyFilter 是基于 GPUImage 的美颜滤镜,可以通过三个维度调整美颜效果。
/** 美颜程度 */
@property (nonatomic, assign) CGFloat beautyLevel;
/** 美白程度 */
@property (nonatomic, assign) CGFloat brightLevel;
/** 色调强度 */
@property (nonatomic, assign) CGFloat toneLevel;
这里需要注意 FSKGPUImageBeautyFilter.m 文件中 initWithFragmentShaderFromString 的定义方式,传入的着色器参数如果不懂相关内容请不要修改,也不要为了代码美观去添加空格个或则换行, 这都是我踩过的大坑,目前的代码都是调试实际验证过的,请放心使用。
RCTFaceDetectView
这里是封装组件的主要代码
RCTFaceDetectView.h
// 在 js 组件中使用的回调方法, 必须使用 RCTBubblingEventBlock 来定义
@property(nonatomic,copy)RCTBubblingEventBlock onFaceCallback;
//传入的美颜参数
@property(nonatomic,copy)NSString *beautyLevel; + (instancetype)sharedInstance; // 单例
- (UIView *)initBeautifyFaceView; // 初始化相机界面 //相机切换前后摄像头
- (void)switchCameraFrontOrBack;
//拍照
-(void)takeFaceDetectCamera:(RCTResponseSenderBlock)successBlock; //设置美颜系数
-(void)setBeautyLevel:(NSString *)level; // 停止相机捕捉
-(void)stopCamera;
此处需要注意
onFaceCallback 是在 js 组件中使用的回调方法,必须使用 RCTBubblingEventBlock 定义,beautyLevel 是 prop 传参,使用正常类型就可以
switchCameraFrontOrBack、takeFaceDetectCamera、stopCamera 是组件的功能方法,之前由于需求的原因,没有封装为组件的传参方法,可以自定义相关调用方法暴露到 js 中,目前 demo 中没有添加,暴露方法参考 中原生方法的封装。写法如下:
#pragma mark - 人脸检测相机:拍照回调拍照图片base64
RCT_REMAP_METHOD(takeFaceDetectCameraWithCallback,takeFaceDetectCamera:(RCTResponseSenderBlock)successBlock){ dispatch_async(dispatch_get_main_queue(), ^{
[[RCTFaceDetectView sharedInstance] takeFaceDetectCamera:successBlock];
});
} #pragma mark - 人脸检测相机:前后摄像头切换
RCT_REMAP_METHOD(switchCameraFrontOrBack,switchCameraFrontOrBack){
dispatch_async(dispatch_get_main_queue(), ^{
[[RCTFaceDetectView sharedInstance] switchCameraFrontOrBack];
});
} #pragma mark - 人脸检测相机:美颜系数
RCT_REMAP_METHOD(setFilterLevel,setBeautyLevel:(float)level){
dispatch_async(dispatch_get_main_queue(), ^{
[[RCTFaceDetectView sharedInstance] setBeautyLevel: [NSString stringWithFormat:@"%f",level]];
});
} #pragma mark --停止视频流--
RCT_EXPORT_METHOD(stopFaceDetectCamera) {
[[RCTFaceDetectView sharedInstance] stopCamera];
[[RCTFaceDetectView sharedInstance] unobserveGlobalNotifications];
}
RCTFaceDetectView.m
要点介绍
如何获取到人脸相关的参数
需要实现ios的代理方法,如下
#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
...
}
metadataObjects 参数中即包含了面部个数以及面部在摄像头中的坐标位置。
如何绘制面部框
此处需要进行坐标转换,将面部在摄像头中的坐标转为在屏幕中的坐标,此处需要使用 transformedMetadataObjectForMetadataObject 方法,具体请查看代码
如何进行美颜
在 GPUImage 中使用 FSKGPUImageBeautyFilter 滤镜,常规写法。
RCTFaceDetectViewManager
将 RCTFaceDetectView 封装的原生组件,暴露到 js 层
更多内容,运行 demo,阅读代码
https://juejin.cn/post/6978297307733164068
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
记录--react native 封装人脸 检测、美颜组件的更多相关文章
- React Native之本地文件系统访问组件react-native-fs的介绍与使用
React Native之本地文件系统访问组件react-native-fs的介绍与使用 一,需求分析 1,需要将图片保存到本地相册: 2,需要创建文件,并对其进行读写 删除操作. 二,简单介绍 re ...
- react native 封装TextInput组件
上一篇 react-native文章提到了TextInput组件对安卓的适配问题,因此对该组件进行封装很有必要. 文章地址 react native定报预披项目知识点总结 TextInput介绍 官 ...
- React Native封装Toast与加载Loading组件
React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...
- React Native 系列(九) -- Tab标签组件
前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...
- React Native 二维码扫描组件
学rn得朋友们,你们知道rn开源项目吗?来吧看这里:http://www.marno.cn/(rn开源项目) React Native学习之路(9) - 注册登录验证的实现 + (用Fetch实现po ...
- React Native填坑之旅--组件生命周期
这次我们来填React Native生命周期的坑.这一点非常重要,需要有一个清晰的认识.如果你了解Android或者iOS的话,你会非常熟悉我们今天要说的的内容. 基本上一个React Native的 ...
- React Native 开发之 (07) 常用组件-View
掌握了React Native的组件就可以使用IOS的原生组件和API. 一 View组件 就像开发web应用程序中,需要使用很多的HTML标签.例如 div,form.但是在基于DIV+CSS布局的 ...
- React Native入门教程2 -- 基本组件使用及样式
在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...
- 【React Native开发】React Native控件之ListView组件解说以及最齐全实例(19)
),React Native技术交流4群(458982758).请不要反复加群!欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章 ...
- React Native中加载指示器组件ActivityIndicator使用方法
这里讲一下React Native中的一个组件——ActivityIndicator,这是一个加载指示器,俗称菊花,很常见的,效果如下所示: 可以看到图中有两个加载指示器,一大一小,这是尺寸不是我设置 ...
随机推荐
- C++——异常处理模块笔记
异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况.异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误.访问无效内存等.C++提供了一套异常处理机制,使得程序 ...
- NC15128 老子的全排列呢
题目链接 题目 题目描述 老李见和尚赢了自己的酒,但是自己还舍不得,所以就耍起了赖皮,对和尚说,光武不行,再来点文的,你给我说出来1-8的全排序,我就让你喝,这次绝不耍你,你能帮帮和尚么? 输入描述 ...
- 老王电子的拆机 ESP32-SOLO-1 填坑报告
ESP32-SOLO-1 拆装 都是带板的, 长这个样子 需要用热风枪从背面吹, 因为中间有焊点, esp32朝下, 用280度大概2到3分钟, 四周需要均匀着风, 用镊子试探天线部分是否松动, 将外 ...
- Swoole从入门到入土(1)——入坑
入坑一个话题,总得有入坑的理由.有好多话题可供选择,但是思来想去,对于PHPer进阶与其急着去掌握一门新的语言,匆忙地踏足一个新的知识体系,还不如先把php圈子的技能点攒齐了. 话说Swoole诞生之 ...
- 承前启后,Java对象内存布局和对象头
承前启后,Java对象内存布局和对象头 大家好,我是小高先生.在我之前的一篇文章<并发编程防御装-锁(基础版)>中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁 ...
- db2伪表sysibm.sysdummy1
$ db2 describe table sysibm.sysdummy1 Column Type Type name ...
- spring boot和redis实现自定义前后分离token认证
说明:文章部分代码引用自github 本项目地址:https://gitee.com/indexman/redis-token-demo 1.token认证流程 此处以前端页面请求后端用户列表接口为例 ...
- CSS加JS实现网页返回顶部功能
最近在设计自己的博客,前端页面在内容很多的时候往下拖动会有滚动条.通常我们都需要一个返回顶部的功能来实现快速来到网页顶部.当然实现方式不止一种,这里我采用的最实用的一种.使用CSS+Jquery方式 ...
- 使用Python读取nc数据
在地学领域,nc 格式的文件可谓随处可见,这种文件可以存储多维数字矩阵,同时又封装了自描述信息(例如经纬度.高度层.时间戳.单位等),因此使用起来十分方便,不用担心数据和描述信息分离而导致数据不可用. ...
- java+mysql数据库实现的学生管理系统
说明: java+mysql数据库实现的学生管理系统 功能 实现增加学生.删除学生.修改学生.学生列表.查询学生功能 截图: 开发工具/技术 java eclipse 价格:50元,有需要联系 微信 ...