1.CoreImage
滤镜的使用(马赛克模糊)

CoreImage是苹果公司为了简化图片处理的难度而开发出来的类库。

随着iOS版本号升级以及硬件性能的不断提升,CoreImage将支持越来越多的滤镜

- (void)hFilter {

// 0.
导入CIImage图片

CIImage *ciImage = [[CIImagealloc] initWithImage:[UIImageimageNamed:@"demo"]];

// 1.
创建出Filter滤镜

CIFilter *filter = [CIFilterfilterWithName:@"CIPixellate"];

[filtersetValue:ciImage

forKey:kCIInputImageKey];

NSLog(@"%@", filter.attributes);

[filtersetDefaults];

CIImage *outImage = [filter valueForKey:kCIOutputImageKey];

// 2.
用CIContext将滤镜中的图片渲染出来

CIContext *context = [CIContextcontextWithOptions:nil];

CGImageRef cgImage = [context createCGImage:outImage

fromRect:[outImage extent]];

// 3.
导出图片

UIImage *showImage = [UIImageimageWithCGImage:cgImage];

CGImageRelease(cgImage);

// 4.
载入出来

UIImageView *imageView = [[UIImageViewalloc] initWithImage:showImage];

imageView.center       =self.view.center;

[self.viewaddSubview:imageView];

}

2.CoreImage
滤镜的组合

不同的滤镜能够组合在一起使用。

能够动态的改动滤镜组合中单个滤镜的參数来实现一种动态调整的效果

- (void)complexCoreImage {

// 0.
导入CIImage图片

CIImage *ciImage = [[CIImagealloc] initWithImage:[UIImageimageNamed:@"demo"]];

// 1.
创建出Filter滤镜

CIFilter *filterOne = [CIFilterfilterWithName:@"CIPixellate"];

[filterOnesetValue:ciImage

forKey:kCIInputImageKey];

[filterOnesetDefaults];

CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];

CIFilter *filterTwo = [CIFilterfilterWithName:@"CIHueAdjust"];

[filterTwosetValue:outImage

forKey:kCIInputImageKey];

[filterTwosetDefaults];

//默觉得0,不设置不能改变。能够封装一个调用

[filterTwosetValue:@(3.14)

forKey:kCIInputAngleKey];

NSLog(@"%@",filterTwo.attributes);//能够看到一些參数 key

CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];

// 2.
用CIContext将滤镜中的图片渲染出来

CIContext *context = [CIContextcontextWithOptions:nil];

CGImageRef cgImage = [context createCGImage:outputImage

fromRect:[outImage extent]];

// 3.
导出图片

UIImage *showImage = [UIImageimageWithCGImage:cgImage];

CGImageRelease(cgImage);

// 4.
载入出来

UIImageView *imageView = [[UIImageViewalloc] initWithImage:showImage];

imageView.center       =self.view.center;

[self.viewaddSubview:imageView];

}

3.在 OpenGLES
下进行渲染

在OpenGLES下进行滤镜的渲染能够提高效率。(GPU渲染,不占用CPU)

假设须要实时查看多个滤镜动态渲染的效果,使用OpenGLES是一个好的选择

#import <GLKit/GLKit.h>

@interface
ViewController ()

@property (nonatomic,strong)
GLKView   *glkView;// 渲染用的buffer视图

@property (nonatomic,strong)
CIFilter  *filter;

@property (nonatomic,strong)
CIImage   *ciImage;

@property (nonatomic,strong)
CIContext *ciContext;

@end

@implementation ViewController

- (void)viewDidLoad {

[superviewDidLoad];

UIImage *showImage = [UIImageimageNamed:@"demo"];

CGRect  rect       =
CGRectMake(, , showImage.size.width, showImage.size.height);

//
获取OpenGLES渲染的上下文

EAGLContext *eagContext = [[EAGLContextalloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

//
创建出渲染的buffer

_glkView = [[GLKViewalloc] initWithFrame:rect

context:eagContext];

[_glkViewbindDrawable];

[self.viewaddSubview:_glkView];

//
创建出CoreImage用的上下文

_ciContext = [CIContextcontextWithEAGLContext:eagContext

options:@{kCIContextWorkingColorSpace : [NSNullnull]}];

// CoreImage相关设置

_ciImage = [[CIImagealloc] initWithImage:showImage];

_filter = [CIFilterfilterWithName:@"CISepiaTone"];

[_filtersetValue:_ciImageforKey:kCIInputImageKey];

[_filtersetValue:@(0)forKey:kCIInputIntensityKey];

//
開始渲染

[_ciContextdrawImage:[_filteroutputImage]

inRect:CGRectMake(,, _glkView.drawableWidth,_glkView.drawableHeight)

fromRect:[_ciImageextent]];

[_glkViewdisplay];

//
动态渲染

,,
, )];

slider.minimumValue =0.f;

slider.maximumValue =1.f;

[slider addTarget:selfaction:@selector(sliderEvent:)forControlEvents:UIControlEventValueChanged];

[self.viewaddSubview:slider];

}

- (void)sliderEvent:(UISlider *)slider {

[_filtersetValue:_ciImageforKey:kCIInputImageKey];

[_filtersetValue:@(slider.value)

forKey:kCIInputIntensityKey];

//
開始渲染

[_ciContextdrawImage:[_filteroutputImage]

inRect:CGRectMake(,, _glkView.drawableWidth,_glkView.drawableHeight)

fromRect:[_ciImageextent]];

[_glkViewdisplay];

}

CoreImage 处理图片的更多相关文章

  1. [Swift通天遁地]四、网络和线程-(10)处理图片:压缩、缩放、圆角、CoreImage滤镜、缓存

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. IOS 中的CoreImage框架(framework)

    http://www.cnblogs.com/try2do-neo/p/3601546.html coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它 ...

  3. IOS 中的CoreImage框架

    IOS 中的CoreImage框架(framework) - time4cnblogs 时间 2014-03-15 00:24:00  博客园-所有随笔区原文  http://www.cnblogs. ...

  4. 基于iOS用CoreImage实现人脸识别

    2018-09-04更新: 很久没有更新文章了,工作之余花时间看了之前写的这篇文章并运行了之前写的配套Demo,通过打印人脸特征CIFaceFeature的属性,发现识别的效果并不是很好,具体说明见文 ...

  5. 使用CoreImage教程

    使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image ...

  6. 11 (OC)* CoreImage

    coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它的结构: 主要分为三部分: 1)定义部分:CoreImage 何CoreImageDefines. ...

  7. nodejs处理图片、CSS、JS链接

    接触Nodejs不深,看到页面上每一个链接都要写一个handler,像在页面显示图片,或者调用外部CSS.JS文件,每个链接都要写一个handler,觉得太麻烦,是否可以写个程序出来,能够自动识别图片 ...

  8. PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转

    [强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...

  9. Filter Effects - 使用 CSS3 滤镜处理图片

    CSS3 Filter(滤镜)属性提供了提供模糊和改变元素颜色的功能.CSS3 Fitler 常用于调整图像的渲染.背景或边框显示效果.这里给大家分享的这个网站,大家可以体验下 CSS3 对图片的处理 ...

随机推荐

  1. SQL语句中如何把文件以二进制数组形式存入数据库

    System.IO.FileStream fs = new FileStream("1.txt", FileMode.Open); string strConn = "D ...

  2. 使用PPT制作交叉密文图

    曾几何时,一张图火遍大江南北,互相流传. 其中的奥秘早已破解出来,但是仍乐趣无穷. 来回顾这样一张图吧! 最近,在朋友圈中,这样的一种图又流行起来,被改成不同的版本. 可是这样一种图片到底是怎样做出来 ...

  3. Lintcode 175 Invert Binary Tree

    I did it in a recursive way. There is another iterative way to do it. I will come back at it later. ...

  4. Python-同时匹配邮箱和电话号码的正则表达式

    同时匹配邮箱和电话号码的正则表达式要想很完美的匹配,不太简单. 各邮箱提供商的标准都多少有些许差别.如:163:6-18个字符,可使用字母.数字.下划线,需以字母开头. gmail:可以使用字母.数字 ...

  5. 求教——使用node做表单,刷新浏览器页面,浏览器为什么会重复提交上次所填的信息

    最近在学些node,按照<nodejs实战>上的代码做练习,发现有表单重复提交的问题 第一次打开页面,显示如图是get请求 图1 现在我们提交aaa,显示如图,post请求 图2 刷新页面 ...

  6. TypeScript:基本类型和接口

    返回TypeScript手册总目录 基本类型(Basic Types) 为了让程序可以使用,我们需要用到一些最简单的数据单元:数字,字符串,结构,布尔值,诸如此类.在TypeScript中,支持许多正 ...

  7. [C++] socket -7 [邮槽]

    ::利用邮槽实现windons进程通信 ::一般情况下CreateMailslot()常被使用在进程通信的服务器上,在客户端则是用函数CreateFile()打开指定的邮槽之后进行相关的操作. ::将 ...

  8. [游戏学习28] MFC 时钟

    >_<:这是一个时钟小程序 >_<:通过调用获得系统时间然后经过计算得出当前时间,然后再以3个圆环表示时分秒. >_<:TAO_CLOCK.h class CMyA ...

  9. 设置jenkins代理

    http://stackoverflow.com/documentation/jenkins/919/introduction-to-jenkins Natively, Jenkins runs on ...

  10. 趋势型指标——MACD

    1.简要介绍▪ 计算方法▪ DIFF▪ DEA▪ MACD▪ 构造原理▪ 缺点2.实战技巧3.运用技巧▪ 应用原理▪ 经典用法▪ 实战战法▪ 捕捉卖点▪ 买卖策略▪ 短线实战4.组合指标运用5.一般研 ...