在上篇博客IOS Core Image之一中了解了下CIImage、CIFilter、CIContext三个类的使用,这篇了解下滤镜链(多滤镜)和人脸检测(不是人脸识别)。

一、多滤镜

1.有些效果不只是一个滤镜能完成的,需要多个滤镜叠加,让一个滤镜的outputImage作为另一个滤镜的inputImage。

在下面的代码中,给图片加了两个滤镜效果一个高斯模糊一个旋转。

  1. #import "ViewController.h"
  2. #import <CoreImage/CoreImage.h>
  3. @interface ViewController ()
  4.  
  5. @end
  6.  
  7. @implementation ViewController
  8.  
  9. - (void)viewDidLoad {
  10. [super viewDidLoad];
  11.  
  12. CIImage *inputImg = [[CIImage alloc]initWithCGImage:[UIImage imageNamed:@"1.jpg"].CGImage];
  13. // 滤镜链合成
  14. CIImage *outputImage = [self oldPhoto:inputImg withAmount:];
  15. CIContext *context=[CIContext contextWithOptions:nil];
  16. CGImageRef cgimg =[context createCGImage:outputImage fromRect:[outputImage extent]];
  17. UIImageView *img = [[UIImageView alloc] initWithFrame:self.view.bounds];
  18. img.backgroundColor = [UIColor redColor];
  19. img.contentMode = UIViewContentModeScaleToFill;
  20. img.image=[UIImage imageWithCGImage:cgimg];
  21. [self.view addSubview:img];
  22. CGImageRelease(cgimg);
  23.  
  24. }
  25. -(CIImage *)oldPhoto:(CIImage *)img withAmount:(float)intensity {
  26.  
  27. //高斯模糊滤镜
  28. CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
  29.  
  30. [gaussianBlurFilter setValue:img forKey:@"inputImage"];
  31. [gaussianBlurFilter setValue: @(intensity) forKey:@"inputRadius"];
  32.  
  33. //旋转滤镜
  34. CIFilter *affineTransformFilter = [CIFilter filterWithName:@"CIAffineTransform"];
  35. [affineTransformFilter setValue:gaussianBlurFilter.outputImage forKey:@"inputImage"];
  36. [affineTransformFilter setValue: [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(intensity)] forKey:@"inputTransform"];
  37. return affineTransformFilter.outputImage;
  38. }
  39.  
  40. - (void)didReceiveMemoryWarning {
  41. [super didReceiveMemoryWarning];
  42. // Dispose of any resources that can be recreated.
  43. }
  44.  
  45. @end

2.效果图

二、人脸检测

1.网上有的写的是人脸识别,了解了下发现CoreImage中的算不上人脸识别,也只是检测下人脸的位置,眼睛、嘴巴、是否微笑等,并不能识别出是不是同一个人。这个参考了博客http://blog.csdn.net/wildfireli/article/details/7164628.用自己素颜图(儿童不宜,戴墨镜观看防止亮瞎眼)试了下还算OK。

  1. //
  2. // ViewController.m
  3. // CoreImage
  4. //
  5. // Created by City--Online on 15/11/10.
  6. // Copyright © 2015年 City--Online. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import <CoreImage/CoreImage.h>
  11. @interface ViewController ()
  12.  
  13. @end
  14.  
  15. @implementation ViewController
  16.  
  17. - (void)viewDidLoad {
  18. [super viewDidLoad];
  19. UIImage* image = [UIImage imageNamed:@"psu.jpg"];
  20. UIImageView *testImage = [[UIImageView alloc] initWithImage: image];
  21. [testImage setTransform:CGAffineTransformMakeScale(, -)];
  22. [[[UIApplication sharedApplication] delegate].window setTransform:
  23. CGAffineTransformMakeScale(, -)];
  24.  
  25. [testImage setFrame:CGRectMake(, , testImage.image.size.width,
  26. testImage.image.size.height)];
  27. [self.view addSubview:testImage];
  28.  
  29. CIImage* ciimage = [CIImage imageWithCGImage:image.CGImage];
  30. // detectorOfType 检测类型 context画布 options字典
  31. CIDetector *detector=[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
  32. NSArray *features= [detector featuresInImage:ciimage];
  33.  
  34. // 在 CIFeature类中有CIFaceFeature、CIRectangleFeature、CIQRCodeFeature、CITextFeature子类
  35. for (CIFaceFeature *faceFeature in features) {
  36. CGFloat faceWidth = faceFeature.bounds.size.width;
  37. if (faceFeature.hasLeftEyePosition) {
  38. [self addViewWithPoint:faceFeature.leftEyePosition withWidth:faceWidth];
  39. }
  40. if (faceFeature.hasRightEyePosition)
  41. {
  42. [self addViewWithPoint:faceFeature.rightEyePosition withWidth:faceWidth];
  43. }
  44. if (faceFeature.hasMouthPosition) {
  45. [self addViewWithPoint:faceFeature.mouthPosition withWidth:faceWidth];
  46. }
  47. }
  48.  
  49. }
  50. -(void)addViewWithPoint:(CGPoint)point withWidth:(float)faceWidth
  51. {
  52. UIView* view = [[UIView alloc] initWithFrame:CGRectMake(point.x-faceWidth*0.1,point.y-faceWidth*0.1, faceWidth*0.2, faceWidth*0.2)];
  53. [view setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
  54. [view setCenter:point];
  55. view.layer.cornerRadius = faceWidth*0.1;
  56. [self.view addSubview:view];
  57. }
  58.  
  59. - (void)didReceiveMemoryWarning {
  60. [super didReceiveMemoryWarning];
  61. // Dispose of any resources that can be recreated.
  62. }
  63.  
  64. @end

2.效果图

由于清屏网无耻,抄袭我博客并将我头像放在它网上,我就把这图去了

三、高斯模糊第三方

项目背景视图要用高斯模糊的效果,在网上找了个第三方UIImage+ImageEffects,东西也不多,效果又很好。

IOS Core Image之二的更多相关文章

  1. iOS开发-定制多样式二维码

    iOS开发-定制多样式二维码   二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...

  2. View Programming Guide for iOS ---- iOS 视图编程指南(二)---View and Window Architecture

    View and Window Architecture 视图和窗口架构 Views and windows present your application’s user interface and ...

  3. iOS Core Animation 简明系列教程

    iOS Core Animation 简明系列教程  看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽 ...

  4. iOS使用Zbar扫描二维码

    iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...

  5. 转 iOS Core Animation 动画 入门学习(一)基础

    iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Coco ...

  6. IOS开发-文件管理(二)

    IOS开发-文件管理(二) 五.Plist文件 String方式添加               NSString *path = [NSHomeDirectory( )  stringByAppen ...

  7. iOS原生CIFilter创建二维码

    iOS原生CIFilter创建二维码 2016-05-31 未来C iOS原生CIFilter创建二维码 关于二维码生成,网上也是有很多,很早以前的第三方库大多数都是通过C++写,也是有的如zxing ...

  8. iOS安全攻防(二十三):Objective-C代码混淆

    iOS安全攻防(二十三):Objective-C代码混淆 class-dump能够非常方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完好的程序给同行留下笑柄. 所以 ...

  9. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

随机推荐

  1. ASP.NET MVC5实现伪静态

    目录 1.什么是伪静态?为什么要实现伪静态? 2.实现APS.NET MVC伪静态的方式有哪些? 3.那么如何实现使用ASP.NET MVC5的伪静态呢? (1)在路由注册中启用特性路由 (2)为需要 ...

  2. Ocelot 新手上路

    新手上路,老司机请多多包含!Ocelot 在博园里文章特别多,但是按照其中一篇文章教程,如果经验很少或者小白,是没法将程序跑向博主的结果. 因此总结下     参考多篇文章,终于达到预期效果. Oce ...

  3. 索引+sql优化

    索引的概念: 索引是提高查询速度的一种手段.索引有很多种,以下是索引树的结构 要求查询出薪资大于5000的雇员信息,只要在树中找到5000的节点,直接查询该节点右边的数据即可,左边就不用管了,这样提高 ...

  4. Linux 服务器上安装Webmin

    1.登陆到服务器 2.新建一个文件夹来保存webmin,建议在个人用户下新建., 3.下载Webmin的安装文件, 命令是: wget http://prdownloads.sourceforge.n ...

  5. 【OCP-12c】2019年CUUG OCP 071考试题库(79题)

    79.Which statement is true about transactions? A. A set of Data Manipulation Language (DML) statemen ...

  6. “全栈2019”Java异常第五章:一定会被执行的finally代码块

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. 使用git提交代码流程

    一.拉取最新代码 一般在本地进行开发时,都是切换到自己的dev分支进行开发,当开发完成需要进行代码提交,在进行代码提交前需要先进行拉取远程仓库代码,进行更新,但是此时会提示需要将本地代码进行commi ...

  8. python 爬恶魔法则(单线程卡成狗)

    from bs4 import BeautifulSoupimport requestsimport sysclass down(object): def __init__(self): self.n ...

  9. iOS学习笔记(8)——GCD初探

    1. AppDelegate.m #import "AppDelegate.h" #import "ViewController.h" @interface A ...

  10. L06-Ubuntu系统中部署Vagrant和VirtualBox

    一.前言 1.Vagrant是一个搭建完整的虚拟开发环境的工具~~~更多关于Vagrant理论可查看这篇博文https://www.cnblogs.com/davenkin/p/vagrant-vir ...