LPBeautySetVC.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. //
  2. // LPBeautySetVC.m
  3. // zhimi
  4. //
  5. // Created by 张灿 on 2019/1/17.
  6. // Copyright © 2019年 caiPro. All rights reserved.
  7. //
  8. #import "LPBeautySetVC.h"
  9. #import "FUOpenGLView.h"
  10. #import "FUCamera.h"
  11. #import "FUManager.h"
  12. #import "FULiveModel.h"
  13. #import "FUAPIDemoBar.h"
  14. @interface LPBeautySetVC()<FUCameraDelegate,FUCameraDataSource,FUAPIDemoBarDelegate>
  15. {
  16. dispatch_semaphore_t signal;
  17. dispatch_semaphore_t semaphore;
  18. }
  19. @property (nonatomic, strong) FUCamera *mCamera ;
  20. @property (strong, nonatomic) FUOpenGLView *renderView;
  21. @property (strong, nonatomic) FUAPIDemoBar *demoBar;
  22. @property (nonatomic,assign) BOOL needSave; //是否需要保存
  23. @property (nonatomic,strong) UIView* botView;
  24. @property (nonatomic,strong) UIButton* btnSwitch;
  25. @property (nonatomic,assign) BOOL beautyOpen;//美颜是否开启
  26. @end
  27. @implementation LPBeautySetVC
  28. - (BOOL)prefersStatusBarHidden
  29. {
  30. return YES;
  31. }
  32. - (FUAPIDemoBar*)demoBar{
  33. if (!_demoBar) {
  34. _demoBar = [[FUAPIDemoBar alloc] initWithFrame:CGRectMake(0, KScreenHeight-182, KScreenWidth, 182)];
  35. if (Is_iPhoneX) {
  36. _demoBar.frame = CGRectMake(0, KScreenHeight-182-30, KScreenWidth, 182);
  37. }
  38. _demoBar.mDelegate = self ;
  39. }
  40. return _demoBar ;
  41. }
  42. -(FUCamera *)mCamera {
  43. if (!_mCamera) {
  44. _mCamera = [[FUCamera alloc] init];
  45. _mCamera.delegate = self ;
  46. // _mCamera.dataSource = self;
  47. }
  48. return _mCamera ;
  49. }
  50. -(FUOpenGLView *)renderView {
  51. if (!_renderView) {
  52. _renderView = [[FUOpenGLView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)];
  53. }
  54. return _renderView ;
  55. }
  56. - (void)viewWillAppear:(BOOL)animated{
  57. [super viewWillAppear:animated];
  58. [UIApplication sharedApplication].idleTimerDisabled = YES;
  59. // if (self.model.type == FULiveModelTypeBeautifyFace) {
  60. // [self demoBarSetBeautyDefultParams];
  61. // }
  62. [self.mCamera startCapture];
  63. }
  64. - (void)viewWillDisappear:(BOOL)animated{
  65. [super viewWillDisappear:animated];
  66. [UIApplication sharedApplication].idleTimerDisabled = YES;
  67. [self.mCamera resetFocusAndExposureModes];
  68. [self.mCamera stopCapture];
  69. }
  70. -(void)viewDidLayoutSubviews {
  71. [super viewDidLayoutSubviews];
  72. // 适配 iPhone X
  73. }
  74. -(void)dealloc{
  75. NSLog(@"dealloc---");
  76. }
  77. -(void)viewDidDisappear:(BOOL)animated {
  78. [super viewDidDisappear:animated];
  79. }
  80. - (void)viewDidLoad {
  81. [super viewDidLoad];
  82. self.view.backgroundColor = [UIColor blackColor];
  83. self.beautyOpen = [LCSaveModel getBeautyModel].beautyOpen;
  84. [self.view addSubview:self.renderView];
  85. [self setupUI];
  86. [self.view addSubview:self.demoBar];
  87. self.demoBar.hidden = YES;
  88. [self.demoBar mas_makeConstraints:^(MASConstraintMaker *make) {
  89. make.bottom.offset(-SafeHeight);
  90. make.left.right.offset(0.0f);
  91. make.height.offset(182.0f);
  92. }];
  93. // NSMutableArray *arr = [FUManager shareManager].dataSource;
  94. // NSLog(@"%@",arr);
  95. // self.model = [FUManager shareManager].dataSource[0][0];
  96. //设置默认曝光度
  97. [self.mCamera setExposureValue:0];
  98. [self.mCamera startCapture];
  99. signal = dispatch_semaphore_create(1);
  100. [self addObserver];
  101. [self demoBarSetBeautyDefultParams];
  102. [[FUManager shareManager] loadFilter];
  103. [[FUManager shareManager] setAsyncTrackFaceEnable:NO];
  104. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchScreenAction:)];
  105. [self.renderView addGestureRecognizer:tap];
  106. //v1.1.2 增加相机权限判断
  107. [UCAuthorityManager cameraAuthority:^{
  108. } denied:^{
  109. UIAlertController *systemAlert = [UIAlertController alertControllerWithTitle:@"请在iphone的“设置-隐私-相机”选项中,允许APP访问您的相机。" message:nil preferredStyle:UIAlertControllerStyleAlert];
  110. UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"现在去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
  111. if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0)
  112. {
  113. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
  114. }
  115. else
  116. {
  117. // 去系统设置页面
  118. if (@available(iOS 10.0, *)) {
  119. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
  120. } else {
  121. // Fallback on earlier versions
  122. }
  123. }
  124. }];
  125. UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
  126. [systemAlert addAction:cancelAction];
  127. [systemAlert addAction:action];
  128. dispatch_async(dispatch_get_main_queue(), ^{
  129. [self presentViewController: systemAlert animated: YES completion: nil];
  130. });
  131. }];
  132. }
  133. - (void)setupUI{
  134. UIButton* backAction = [[UIButton alloc]initWithFrame:CGRectMake(14, StatusBarHeight + 10.0f, 24, 24)];
  135. // if (Is_iPhoneX) {
  136. // backAction.frame = CGRectMake(15, 45, 40, 40);
  137. // }
  138. [backAction setImage:[UIImage imageNamed:@"vqu_images_return_white"] forState:(UIControlStateNormal)];
  139. [backAction setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
  140. backAction.adjustsImageWhenHighlighted = NO;
  141. [backAction addTarget:self action:@selector(backClick) forControlEvents:(UIControlEventTouchUpInside)];
  142. [self.view addSubview:backAction];
  143. UIButton* beautSwiBtn = [[UIButton alloc]initWithFrame:CGRectMake(KScreenWidth-62-14, StatusBarHeight + 12.0f, 62, 20)];
  144. if (Is_iPhoneX) {
  145. // backAction.frame = CGRectMake(KScreenWidth-68-15, 45, 68, 32);
  146. }
  147. [beautSwiBtn setImage:[UIImage imageNamed:@"vqu_images_beauty_open"] forState:(UIControlStateSelected)];
  148. [beautSwiBtn setImage:[UIImage imageNamed:@"vqu_images_beauty_off"] forState:(UIControlStateNormal)];
  149. beautSwiBtn.adjustsImageWhenHighlighted = NO;
  150. [beautSwiBtn addTarget:self action:@selector(beautSwiClick:) forControlEvents:(UIControlEventTouchUpInside)];
  151. beautSwiBtn.selected = self.beautyOpen;
  152. self.btnSwitch = beautSwiBtn;
  153. [self.view addSubview:beautSwiBtn];
  154. // UIButton* beauDefBtn = [[UIButton alloc]initWithFrame:CGRectMake(KScreenWidth-62-14, CGRectGetMaxY(beautSwiBtn.frame)+20, 62, 20)];
  155. // beauDefBtn.backgroundColor = HexColorFromRGBA(0x000000, 0.4);
  156. // beauDefBtn.layer.cornerRadius = 10;
  157. // beauDefBtn.layer.masksToBounds = YES;
  158. // beauDefBtn.titleLabel.font = LCFont12;
  159. // [beauDefBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
  160. // [beauDefBtn setTitle:@"恢复默认" forState:UIControlStateNormal];
  161. // [beauDefBtn addTarget:self action:@selector(beauDefClick) forControlEvents:(UIControlEventTouchUpInside)];
  162. // [self.view addSubview:beauDefBtn];
  163. UIView* botView = [[UIView alloc]initWithFrame:CGRectMake(0, KScreenHeight-120, KScreenWidth, 70)];
  164. self.botView = botView;
  165. [self.view addSubview:botView];
  166. UIButton* beautSaveBtn = [[UIButton alloc]initWithFrame:CGRectMake(KScreenWidth/2-35, 0, 70, 70)];
  167. [beautSaveBtn setImage:[UIImage imageNamed:@"vqu_images_beauty_save"] forState:(UIControlStateNormal)];
  168. beautSaveBtn.adjustsImageWhenHighlighted = NO;
  169. [beautSaveBtn addTarget:self action:@selector(beautSave) forControlEvents:(UIControlEventTouchUpInside)];
  170. [self.botView addSubview:beautSaveBtn];
  171. UIButton* beautSetBtn = [[UIButton alloc]initWithFrame:CGRectMake(KScreenWidth/4-45, 8, 54, 54)];
  172. [beautSetBtn setImage:[UIImage imageNamed:@"vqu_images_beauty_be"] forState:(UIControlStateNormal)];
  173. beautSetBtn.adjustsImageWhenHighlighted = NO;
  174. [beautSetBtn addTarget:self action:@selector(beautSetClick) forControlEvents:(UIControlEventTouchUpInside)];
  175. [self.botView addSubview:beautSetBtn];
  176. UIButton* beautChangeBtn= [[UIButton alloc]initWithFrame:CGRectMake(KScreenWidth*3/4-10, 8, 54, 54)];
  177. [beautChangeBtn setImage:[UIImage imageNamed:@"vqu_images_beauty_switch"] forState:(UIControlStateNormal)];
  178. beautChangeBtn.adjustsImageWhenHighlighted = NO;
  179. [beautChangeBtn addTarget:self action:@selector(changeCamera:) forControlEvents:(UIControlEventTouchUpInside)];
  180. [self.botView addSubview:beautChangeBtn];
  181. }
  182. - (void)beautSetClick{
  183. self.botView.hidden = YES;
  184. self.demoBar.hidden = NO;
  185. }
  186. - (void)beauDefClick{
  187. [LCSaveModel saveBeautyModel:[[LZDefaultBeautyModel alloc]init]];
  188. [[FUManager shareManager] resetAllBeautyParams];
  189. [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeSkin];
  190. [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeShape];
  191. int handle = [[FUManager shareManager] getHandleAboutType:FUNamaHandleTypeBeauty];
  192. [FURenderer itemSetParam:handle withName:@"filter_name" value:[[FUManager shareManager].seletedFliter.mParam lowercaseString]];
  193. [FURenderer itemSetParam:handle withName:@"filter_level" value:@([FUManager shareManager].seletedFliter.mValue)]; //滤镜程度
  194. [self demoBarSetBeautyDefultParams];
  195. [self.demoBar restBeautyDefaultValue];
  196. [self.demoBar setDefaultFilter:[FUManager shareManager].seletedFliter];
  197. [ZCHUDHelper showTitle:@"已恢复默认美颜设置"];
  198. self.btnSwitch.selected = YES;
  199. self.needSave = YES;
  200. }
  201. - (void)beautSwiClick:(UIButton *)sender {
  202. sender.selected = !sender.selected;
  203. self.beautyOpen = sender.selected;
  204. if (sender.selected) {
  205. [self demoBarSetBeautyDefultParams];
  206. self.needSave = YES;
  207. }else{
  208. [self demoBarSetBeautyDefultParams];
  209. self.needSave = YES;
  210. }
  211. }
  212. - (void)changeCamera:(UIButton *)sender {
  213. sender.userInteractionEnabled = NO ;
  214. dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
  215. dispatch_after(delayTime, dispatch_get_main_queue(), ^(void){
  216. sender.userInteractionEnabled = YES ;
  217. });
  218. [self.mCamera changeCameraInputDeviceisFront:sender.selected];
  219. /**切换摄像头要调用此函数*/
  220. [[FUManager shareManager] onCameraChange];
  221. sender.selected = !sender.selected ;
  222. }
  223. - (void)beautSave{
  224. //保存然后退出
  225. if (self.beautyOpen) {
  226. LZDefaultBeautyModel* model = [LCSaveModel getBeautyModel];
  227. model.beautyOpen = self.beautyOpen;
  228. FUBeautyParam *seletedFliter = [FUManager shareManager].seletedFliter;
  229. model.selectedFilter = seletedFliter.mParam;
  230. model.selectedFilterLevel = seletedFliter.mValue;
  231. /* 美肤参数 */
  232. for (FUBeautyParam *param in [FUManager shareManager].skinParams) {
  233. [self setBeautyModel:model param:param];
  234. }
  235. /* 美型参数 */
  236. for (FUBeautyParam *param in [FUManager shareManager].shapeParams) {
  237. [self setBeautyModel:model param:param];
  238. }
  239. [LCSaveModel saveBeautyModel:model];
  240. [ZCHUDHelper showTitle:@"保存成功"];
  241. [self back];
  242. }else{
  243. LZDefaultBeautyModel* model = [LCSaveModel getBeautyModel];
  244. model.beautyOpen = self.beautyOpen;
  245. [LCSaveModel saveBeautyModel:model];
  246. [self back];
  247. }
  248. }
  249. - (void)setBeautyModel:(LZDefaultBeautyModel *)model param:(FUBeautyParam *)param{
  250. NSArray *properties = [self getDefaultBeautyModelAllProperties];
  251. if ([properties containsObject:param.mParam]) {
  252. [model setValue:@(param.mValue) forKey:param.mParam];
  253. }
  254. }
  255. //获取对象的所有属性
  256. - (NSArray *)getDefaultBeautyModelAllProperties
  257. {
  258. u_int count;
  259. objc_property_t *properties =class_copyPropertyList([LZDefaultBeautyModel class], &count);
  260. NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
  261. for (int i = 0; i<count; i++)
  262. {
  263. const char* propertyName =property_getName(properties[i]);
  264. [propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
  265. }
  266. free(properties);
  267. return propertiesArray;
  268. }
  269. - (void)backClick{
  270. if (self.needSave) {
  271. //弹窗保存美颜设置
  272. UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"保存设置" message:@"保存当前美颜设置,视频中直接使用" preferredStyle:UIAlertControllerStyleAlert];
  273. UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
  274. [self back];
  275. }];
  276. UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"保存" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
  277. [self.navigationController popToRootViewControllerAnimated:NO];
  278. [self beautSave];
  279. }];
  280. [alertController addAction:cancelAction];
  281. [alertController addAction:okAction];
  282. [self presentViewController:alertController animated:YES completion:nil];
  283. }else{
  284. [self back];
  285. }
  286. }
  287. - (void)back{
  288. dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
  289. [self.mCamera stopCapture];
  290. [[FUManager shareManager] onCameraChange];
  291. UIViewController *presenting = self.presentingViewController;
  292. if(presenting){
  293. [self dismissViewControllerAnimated:YES completion:nil];
  294. }else{
  295. [self.navigationController popViewControllerAnimated:YES];
  296. }
  297. dispatch_semaphore_signal(signal);
  298. }
  299. - (void)touchScreenAction:(UITapGestureRecognizer *)tap {
  300. if (tap.view == self.renderView) {
  301. self.demoBar.hidden = YES;
  302. self.botView.hidden = NO;
  303. }
  304. }
  305. #pragma mark - FUCameraDataSource
  306. -(CGPoint)faceCenterInImage:(FUCamera *)camera{
  307. CGPoint center = CGPointMake(-1, -1);
  308. BOOL isHaveFace = [[FUManager shareManager] isTracking];
  309. if (isHaveFace) {
  310. center = [self cameraFocusAndExposeFace];
  311. }
  312. // NSLog(@"人脸曝光点-----%@",NSStringFromCGPoint(center));
  313. return center;
  314. }
  315. -(CGPoint)cameraFocusAndExposeFace{
  316. CGPoint center = [[FUManager shareManager] getFaceCenterInFrameSize:[UIScreen mainScreen].bounds.size];
  317. return CGPointMake(center.y, self.mCamera.isFrontCamera ? center.x : 1 - center.x);
  318. }
  319. #pragma mark --- FUCameraDelegate
  320. -(void)didOutputVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer {
  321. CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) ;
  322. if (self.beautyOpen) {
  323. [[FUManager shareManager] renderItemsToPixelBuffer:pixelBuffer];
  324. }
  325. [self.renderView displayPixelBuffer:pixelBuffer withLandmarks:NULL count:0 MAX:YES];
  326. NSLog(@"美颜一直在输出");
  327. }
  328. - (void)demoBarSetBeautyDefultParams {
  329. _demoBar.mDelegate = nil ;
  330. [_demoBar reloadSkinView:[FUManager shareManager].skinParams];
  331. [_demoBar reloadShapView:[FUManager shareManager].shapeParams];
  332. [_demoBar reloadFilterView:[FUManager shareManager].filters];
  333. _demoBar.mDelegate = self;
  334. }
  335. -(void)demoBarDidShowTopView:(BOOL)shown {
  336. //是否显示上半部分
  337. }
  338. #pragma mark - FUAPIDemoBarDelegate
  339. -(void)restDefaultValue:(int)type{
  340. if (type == 1) {//美肤
  341. [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeSkin];
  342. }
  343. if (type == 2) {
  344. [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeShape];
  345. }
  346. }
  347. -(void)filterValueChange:(FUBeautyParam *)param{
  348. self.needSave = YES;
  349. int handle = [[FUManager shareManager] getHandleAboutType:FUNamaHandleTypeBeauty];
  350. [FURenderer itemSetParam:handle withName:@"filter_name" value:[param.mParam lowercaseString]];
  351. [FURenderer itemSetParam:handle withName:@"filter_level" value:@(param.mValue)]; //滤镜程度
  352. [FUManager shareManager].seletedFliter = param;
  353. }
  354. -(void)beautyParamValueChange:(FUBeautyParam *)param{
  355. self.needSave = YES;
  356. if (_demoBar.selBottomIndex == 3) {//风格栏
  357. if (param.beautyAllparams) {
  358. [[FUManager shareManager] setStyleBeautyParams:param.beautyAllparams];
  359. [FUManager shareManager].currentStyle = param;
  360. }else{// 点击无
  361. [FUManager shareManager].currentStyle = param;
  362. [[FUManager shareManager] loadFilter];
  363. }
  364. return;
  365. }
  366. if ([param.mParam isEqualToString:@"cheek_narrow"] || [param.mParam isEqualToString:@"cheek_small"]){//程度值 只去一半
  367. [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue * 0.5];
  368. }else if([param.mParam isEqualToString:@"blur_level"]) {//磨皮 0~6
  369. [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue * 6];
  370. }else{
  371. [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue];
  372. }
  373. }
  374. #pragma mark --- Observer
  375. - (void)addObserver{
  376. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignActive) name:UIApplicationWillResignActiveNotification object:nil];
  377. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
  378. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
  379. }
  380. - (void)willResignActive
  381. {
  382. if (self.navigationController.visibleViewController == self) {
  383. [_mCamera stopCapture];
  384. }
  385. }
  386. - (void)willEnterForeground
  387. {
  388. if (self.navigationController.visibleViewController == self) {
  389. [_mCamera startCapture];
  390. }
  391. }
  392. - (void)didBecomeActive
  393. {
  394. if (self.navigationController.visibleViewController == self) {
  395. [_mCamera startCapture];
  396. }
  397. }
  398. - (void)didReceiveMemoryWarning {
  399. [super didReceiveMemoryWarning];
  400. }
  401. @end