在上篇博客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之二的更多相关文章

  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. 销售系统项目业务分析和Java中使用邮箱

    项目一般大致可分为三个模块, 我们以销售系统为例 分为 基础模块 进货模块 财务模块三个 基础模块分为:权限模块 产品模块和基础代码,基础模块的设计十分重要会影响到整个项目, 代码较为简单 核心模块 ...

  2. sql server中的 trimtrailingblanks

    使用sp_help 查出 发现有个这个属性, 如何修改呢? SET ANSI_PADDING ONAlter Table Sys_users_History Alter   column PveSit ...

  3. 【12c OCP】CUUG OCP认证071考试原题解析(36)

    36.choose the best answer View the Exhibits and examine the structures of the PRODUCTS, SALES, and C ...

  4. LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)

    题面 传送门 题解 首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了 我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪 ...

  5. aspx代码审计-1

    今天和大家分享一下aspx网站的代码审计,漏洞类型就是SQL注入和cookie欺骗. 本文作者:i春秋签约作家——非主流 今天看的cms名字叫做:XX星员工请假系统 我们首先看一下网站的目录结构: 其 ...

  6. Python dict转化为string方法

    dict-->string: str() string-->dict eval()(这个只是网上看的,没实测)

  7. Elasticsearch(八)【NEST高级客户端--分析器】

    分析 分析是将文本(如任何电子邮件的正文)转换为添加到反向索引中进行搜索的tokens或terms的过程. 分析由analyzer执行,分析器可以是内置分析器或每个索引定义的定制分析器. 书写分析器测 ...

  8. Lucene7.4学习和简单使用

    简述: 前面从新回顾学习了Solr,正好也借此机会顺便学习一下Lucene. 一.什么是Lucene? 全文检索的一个实现方式,也是非结构化数据查询的方法.应用场景:在数据量大,数据结构不固定的时候, ...

  9. C#-输入输出,类型,运算符,语句的练习——★判断年份是否是闰年★

    //输入一个年份,判断是否是闰年 //(能被4整除却不能被100整除的,年份世纪年份能被400整除的是闰年) Console.Write("请输入一个年份:"); int year ...

  10. 工具篇-大数据组件的一些快捷Shell操作

    一.Hbase 1. HBase shell窗口进入 执行hbase shell 2. HBase表的创建 # 语法:create <table>, {NAME => <fam ...