CoreImage 处理图片
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 处理图片的更多相关文章
- [Swift通天遁地]四、网络和线程-(10)处理图片:压缩、缩放、圆角、CoreImage滤镜、缓存
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- IOS 中的CoreImage框架(framework)
http://www.cnblogs.com/try2do-neo/p/3601546.html coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它 ...
- IOS 中的CoreImage框架
IOS 中的CoreImage框架(framework) - time4cnblogs 时间 2014-03-15 00:24:00 博客园-所有随笔区原文 http://www.cnblogs. ...
- 基于iOS用CoreImage实现人脸识别
2018-09-04更新: 很久没有更新文章了,工作之余花时间看了之前写的这篇文章并运行了之前写的配套Demo,通过打印人脸特征CIFaceFeature的属性,发现识别的效果并不是很好,具体说明见文 ...
- 使用CoreImage教程
使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image ...
- 11 (OC)* CoreImage
coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它的结构: 主要分为三部分: 1)定义部分:CoreImage 何CoreImageDefines. ...
- nodejs处理图片、CSS、JS链接
接触Nodejs不深,看到页面上每一个链接都要写一个handler,像在页面显示图片,或者调用外部CSS.JS文件,每个链接都要写一个handler,觉得太麻烦,是否可以写个程序出来,能够自动识别图片 ...
- PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转
[强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...
- Filter Effects - 使用 CSS3 滤镜处理图片
CSS3 Filter(滤镜)属性提供了提供模糊和改变元素颜色的功能.CSS3 Fitler 常用于调整图像的渲染.背景或边框显示效果.这里给大家分享的这个网站,大家可以体验下 CSS3 对图片的处理 ...
随机推荐
- 01:Geoserver发布shapfile,中文字段乱码问题
软件环境:Geoserver 2.1.0 UDig 1.2.1 shapfile文件结构:FID 地物名称 变化图斑 ...
- Lvs之NAT、DR、TUN三种模式的应用配置案例
LVS 一.LVS简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的 ...
- C#开发中使用Npoi操作excel实例代码
C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...
- [java基础]计算机基础知识
计算机=硬件+软件 1.硬件 计算机核心:CPU.CPU是计算机运算和控制的核心,用来接收计算机指令和运行计算程序. 数据从硬盘加载到内存,CUP从内存读取数据进行运算.内存存取数据快,但是断电或者退 ...
- haskell中的do
在haskell中,有一个do的语句专门用来做一些不那么“干净”的事情,比如读写都需要用do来开头 一开始以为do的作用是做monad,后来发现是错误的,其实do做的事情是包裹一个顺序操作 比如在如下 ...
- Centos6.7下安装配置VPN
在Vultr上买了台VPS准备做VPN,不贵5刀,位置是日本东京的.ping值在100-200之间,还好算说的过去. Vultr地址 系统选择的Centos6 的版本是6.7 在网上查了查linux下 ...
- NBIbatis 框架体系说明
框架体系说明 Application 表现层 表现层必须通过Business业务规则层操作数据库,不能直接调用DataAccess数据访问. Sqlmap.config配置: connectionSt ...
- [JS12] 统计访问次数
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- node.js cluster多进程、负载均衡和平滑重启
1 cluster多进程 cluster经过好几代的发展,现在已经比较好使了.利用cluster,可以自动完成子进程worker分配request的事情,就不再需要自己写代码在master进程中rob ...
- Liferay7 BPM门户开发之30: 通用帮助类Validator、ArrayUtil、StringUtil等使用
废话不多说,直接上代码. 验证类Validator 主要是空验证.数字.格式验证 调用的例子: protected void validateEmailFrom(ActionRequest actio ...