IOS Core Image之二
在上篇博客IOS Core Image之一中了解了下CIImage、CIFilter、CIContext三个类的使用,这篇了解下滤镜链(多滤镜)和人脸检测(不是人脸识别)。
一、多滤镜
1.有些效果不只是一个滤镜能完成的,需要多个滤镜叠加,让一个滤镜的outputImage作为另一个滤镜的inputImage。
在下面的代码中,给图片加了两个滤镜效果一个高斯模糊一个旋转。
#import "ViewController.h" #import <CoreImage/CoreImage.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CIImage *inputImg = [[CIImage alloc]initWithCGImage:[UIImage imageNamed:@"1.jpg"].CGImage]; // 滤镜链合成 CIImage *outputImage = [self oldPhoto:inputImg withAmount:]; CIContext *context=[CIContext contextWithOptions:nil]; CGImageRef cgimg =[context createCGImage:outputImage fromRect:[outputImage extent]]; UIImageView *img = [[UIImageView alloc] initWithFrame:self.view.bounds]; img.backgroundColor = [UIColor redColor]; img.contentMode = UIViewContentModeScaleToFill; img.image=[UIImage imageWithCGImage:cgimg]; [self.view addSubview:img]; CGImageRelease(cgimg); } -(CIImage *)oldPhoto:(CIImage *)img withAmount:(float)intensity { //高斯模糊滤镜 CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; [gaussianBlurFilter setValue:img forKey:@"inputImage"]; [gaussianBlurFilter setValue: @(intensity) forKey:@"inputRadius"]; //旋转滤镜 CIFilter *affineTransformFilter = [CIFilter filterWithName:@"CIAffineTransform"]; [affineTransformFilter setValue:gaussianBlurFilter.outputImage forKey:@"inputImage"]; [affineTransformFilter setValue: [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(intensity)] forKey:@"inputTransform"]; return affineTransformFilter.outputImage; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
2.效果图
二、人脸检测
1.网上有的写的是人脸识别,了解了下发现CoreImage中的算不上人脸识别,也只是检测下人脸的位置,眼睛、嘴巴、是否微笑等,并不能识别出是不是同一个人。这个参考了博客http://blog.csdn.net/wildfireli/article/details/7164628.用自己素颜图(儿童不宜,戴墨镜观看防止亮瞎眼)试了下还算OK。
// // ViewController.m // CoreImage // // Created by City--Online on 15/11/10. // Copyright © 2015年 City--Online. All rights reserved. // #import "ViewController.h" #import <CoreImage/CoreImage.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIImage* image = [UIImage imageNamed:@"psu.jpg"]; UIImageView *testImage = [[UIImageView alloc] initWithImage: image]; [testImage setTransform:CGAffineTransformMakeScale(, -)]; [[[UIApplication sharedApplication] delegate].window setTransform: CGAffineTransformMakeScale(, -)]; [testImage setFrame:CGRectMake(, , testImage.image.size.width, testImage.image.size.height)]; [self.view addSubview:testImage]; CIImage* ciimage = [CIImage imageWithCGImage:image.CGImage]; // detectorOfType 检测类型 context画布 options字典 CIDetector *detector=[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}]; NSArray *features= [detector featuresInImage:ciimage]; // 在 CIFeature类中有CIFaceFeature、CIRectangleFeature、CIQRCodeFeature、CITextFeature子类 for (CIFaceFeature *faceFeature in features) { CGFloat faceWidth = faceFeature.bounds.size.width; if (faceFeature.hasLeftEyePosition) { [self addViewWithPoint:faceFeature.leftEyePosition withWidth:faceWidth]; } if (faceFeature.hasRightEyePosition) { [self addViewWithPoint:faceFeature.rightEyePosition withWidth:faceWidth]; } if (faceFeature.hasMouthPosition) { [self addViewWithPoint:faceFeature.mouthPosition withWidth:faceWidth]; } } } -(void)addViewWithPoint:(CGPoint)point withWidth:(float)faceWidth { UIView* view = [[UIView alloc] initWithFrame:CGRectMake(point.x-faceWidth*0.1,point.y-faceWidth*0.1, faceWidth*0.2, faceWidth*0.2)]; [view setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]]; [view setCenter:point]; view.layer.cornerRadius = faceWidth*0.1; [self.view addSubview:view]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
2.效果图
由于清屏网无耻,抄袭我博客并将我头像放在它网上,我就把这图去了
三、高斯模糊第三方
项目背景视图要用高斯模糊的效果,在网上找了个第三方UIImage+ImageEffects,东西也不多,效果又很好。
IOS Core Image之二的更多相关文章
- iOS开发-定制多样式二维码
iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...
- View Programming Guide for iOS ---- iOS 视图编程指南(二)---View and Window Architecture
View and Window Architecture 视图和窗口架构 Views and windows present your application’s user interface and ...
- iOS Core Animation 简明系列教程
iOS Core Animation 简明系列教程 看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽 ...
- iOS使用Zbar扫描二维码
iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...
- 转 iOS Core Animation 动画 入门学习(一)基础
iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Coco ...
- IOS开发-文件管理(二)
IOS开发-文件管理(二) 五.Plist文件 String方式添加 NSString *path = [NSHomeDirectory( ) stringByAppen ...
- iOS原生CIFilter创建二维码
iOS原生CIFilter创建二维码 2016-05-31 未来C iOS原生CIFilter创建二维码 关于二维码生成,网上也是有很多,很早以前的第三方库大多数都是通过C++写,也是有的如zxing ...
- iOS安全攻防(二十三):Objective-C代码混淆
iOS安全攻防(二十三):Objective-C代码混淆 class-dump能够非常方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完好的程序给同行留下笑柄. 所以 ...
- iOS - Core Animation 核心动画
1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...
随机推荐
- PostgreSQL查询数据(连接查询和子查询)
原料 --用户表 create table "SysUser"( "UserId" serial, --用户Id,自增 "UserName" ...
- 自己从0开始学习Unity的笔记 VI (C#的for循环练习)
最近学到了for循环,我觉得其实看情况吧,和while挺像的,不过适合于累加或者累减这类的,for循环要更好用一点 for循环首先格式是 ; i < length; i++) { } 意思很简单 ...
- 设置TeeChart的提示文本
使用第三方Steema的TeeChart控件,设置鼠标放在某一线条点上,显示某一点的数据标签问题(虚线型十字光标基准线,放在线上显示对应点的二维坐标轴数据数据),调用InitTeeChartTipTo ...
- 数据库工具SQLite Expert Personal的简单使用
官方网站: sqliteexpert官方网址 - SQLite administration | SQLite Expert 先使用SQLite Expert Personal熟悉SQLite语句 插 ...
- css细节复习笔记——浮动
CSS除了能够改变字体.背景和所有其他属性,还能够完成基本布局任务. div+css通过浮动和定位.盒子模型等技术应用,是最常用的布局方式. 定位的基本思想很简单,它允许定义元素框相对于其正常位置应该 ...
- Amazon新一代云端关系数据库Aurora(下)
本文由 网易云发布. 作者:郭忆 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 故障恢复 MySQL基于Check point的机制,周期性的建立redo log与数据页的一致点.一旦数据库 ...
- java中集合
一. List集合: 一次只存储一个元素 1.常用的list集合是ArrayList (1)在创建这个集合的对象时, 需要指定这个集合存储的数据类型! 否则这个集合的数据是不安全的. (2)与数组的 ...
- ObjectARX动态添加AutoCAD传统下拉菜单入门篇(一)
ObjectARX动态添加传统下拉菜单入门篇 图文by edata , 转载注明出处 http://www.cnblogs.com/edata AutoCAD 添加传统下拉菜单有很多种方式,比较典型 ...
- Python简单登录密码比对
# 源于Github的一段源码,编写的比较规范,应该是专业选手! # encoding:utf-8 __author__ = 'www.yeayee.com' # 由本站增加注释,可随意Fork.Co ...
- php请求远程url内容方法
php请求远程url内容有两个方法fopen/file_get_contents和curl. 1,fopen/file_get_contents与curl的差异 (1)fopen /file_get_ ...