这篇文章主要介绍了iOS给图片添加滤镜使用openGLES动态渲染图片详解及实例的相关资料,需要的朋友可以参考下
iOS给图片添加滤镜&使用openGLES动态渲染图片
给图片增加滤镜有这两种方式: CoreImage / openGLES
下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤:
#1.导入CIImage格式的原始图片
#2.创建CIFilter滤镜
#3.用CIContext将滤镜中的图片渲染出来
#4.导出渲染后的图片
参考代码:
//导入CIImage
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"hua"]];
//创建出Filter滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setDefaults];
CIImage *outImage = [filter valueForKey:kCIOutputImageKey];
//用CIContext将滤镜中的图片渲染出来
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outImage
fromRect:[outImage extent]];
//导出图片
UIImage *showImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
UIImageView *imageView = [[UIImageView alloc] initWithImage:showImage];
imageView.center = self.view.center;
[self.view addSubview:imageView];
当要设置多个滤镜的时候, 出了新创建一个CIFilter外还要额外设定kCIInputAngleKey, 代码如下:
//导入CIImage
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"hua.jpeg"]];
//创建出Filter滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setDefaults];
CIImage *outImage = [filter valueForKey:kCIOutputImageKey];
CIFilter *filterTwo = [CIFilter filterWithName:@"CIHueAdjust"];
[filterTwo setValue:outImage forKey:kCIInputImageKey];
[filterTwo setDefaults];
[filterTwo setValue:@(1.0f) forKey:kCIInputAngleKey]; //如果不增加这行新增的滤镜不会生效
CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];
//用CIContext将滤镜中的图片渲染出来
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outputImage
fromRect:[outputImage extent]];
//导出图片
UIImage *showImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
UIImageView *imageView = [[UIImageView alloc] initWithImage:showImage];
imageView.center = self.view.center;
[self.view addSubview:imageView];
下面来介绍怎么用openGLES来使用滤镜渲染图片
使用openGlES的步骤大致如下:
#1.导入要渲染的图片
#2.获取OpenGLES渲染的上下文
#3.创建出渲染的GLKView buffer
#4.创建CoreImage的上下文
#5.进行CoreImage的相关设置
#6.开始渲染并显示图片
参考代码如下:
//导入要渲染的图片
UIImage *showImage = [UIImage imageNamed:@"hua.jpeg"];
CGRect rect = CGRectMake(0, 0, showImage.size.width, showImage.size.height);
//获取OpenGLES渲染的上下文
EAGLContext *eagContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
//创建出渲染的buffer
GLKView *glkView = [[GLKView alloc] initWithFrame:rect
context:eagContext];
[glkView bindDrawable];
[self.view addSubview:glkView];
//创建出CoreImage的上下文
CIContext *ciContext = [CIContext contextWithEAGLContext:eagContext
options:@{kCIContextWorkingColorSpace: [NSNull null]}];
//CoreImage相关设置
CIImage *ciImage = [[CIImage alloc] initWithImage:showImage];
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:@(0) forKey:kCIInputIntensityKey];
//开始渲染
[ciContext drawImage:[filter valueForKey:kCIOutputImageKey]
inRect:CGRectMake(0, 0, glkView.drawableWidth, glkView.drawableHeight)
fromRect:[ciImage extent]];
[glkView display];
如果要动态渲染, 可以通过UISilder动态调整一下代码的vaule值
[filter setValue:vaule forKey:kCIInputIntensityKey];
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文标题为:iOS给图片添加滤镜&使用openGLES动态渲染图片详解及实例
基础教程推荐
- Flutter进阶之实现动画效果(三) 2022-10-28
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- Android开发Compose集成高德地图实例 2023-06-15
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- IOS获取系统相册中照片的示例代码 2023-01-03
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- iOS开发使用XML解析网络数据 2022-11-12
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- Android实现短信验证码输入框 2023-04-29
- iOS开发 全机型适配解决方法 2023-01-14