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 定时器 具体 ...
随机推荐
- Application可以被重用,从哪里看出来的?
一开始Context是静态的,并且创建时赋值,然后校验用户访问权限的时候,出现了问题, 调试看到,每次请求的url都一样,我就发现了每次Contetx都是一样的, 说明每次请求的Application ...
- 【01】Kubernets:捋一捋概念性东西
写在前面的话 docker 先告一段,现在开始进入 Kubernets(K8S) 的学习阶段,在学习过程中,可结合之前学的 docker swarm 比对着理解. 啥是 K8S 先来看一下两个 log ...
- python网络编程--粘包解决方案 和 subprocess模块
1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...
- POJ的练习题
http://wenku.baidu.com/link?url=PT1gkBWC3eXuzzs0QqWklC0VNYkf5ynxBFguXPGYR22l1D2tXmQ4VjnsWvbFyvj1fqGi ...
- jQuery中animate与scrollTop、offset().top实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MySQL中LOCATE用法
SELECT LOCATE('q', 'asqdfasdfser') 返回 3 SELECT LOCATE('q', 'asqdfasqdfser',4) 返回 8 SELECT * from my ...
- javascript高逼格代码实现数组去重,JSON深度拷贝,匿名函数自执行,数字取整等
1.如何装逼用代码骂别人傻逼 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] 2.如何优雅的用代 ...
- 空行会影响 Java 编译吗?
简评:往往越简单的问题越容易被人们忽略. 问题 这个月的 Stack Overflow 有篇热门文章是国外有位开发者提出: 当我仅仅对 Java 类增加了一行空行,为什么编译后得到了两个不同的字节码文 ...
- python 之 比较哪个数据大小
#定义一个字典info={}#定义比较的人数n=int(input("请输入你要比较的人数"))#循环while(n): #输入a,b 两个数据 ,分别代表学号 和分数 # 把输入 ...
- php脚本cli 模式运行
参考文章 http://rapheal.sinaapp.com/2013/11/20/php_zend_hello_world/ http://www.douban.com/note/33788568 ...