ios 滤镜处理(详细滤镜介绍)及处理方法
2016-09-13 10:48
656 查看
小弟最近正在研究语音识别,,,,,如有大神赐教,,万分感激,,,目前没有办法对人物的感情 进行识别,,如有人做过音乐软件,,,类似唱吧的应用,,希望提供思路。。qq:2464294279 mail: xoxo_x.126.com
**
首先你需要导入 CoreImage.framework 框架
然后我们先来看看3个主要的类:
CIContext:它与Core Graphics 和 OpenGL context类似,所有Core Image的处理流程都通过它来进行;
CIImage:它用来存放图片数据,可以通过UIImage,图片文件或像素数据创建;
CIFilter:通过它来定义过滤器的详细属性。
**
滤镜信息介绍
效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/13/6b99b736561f9efa2efc8515d14e0f35)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/13/7b22423fd5dec204463e67cbcddb67e6)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/13/f39c605a01319955c5c189d67e00fb06)
代码如下:
小弟最近正在研究语音识别,,,,,如有大神赐教,,万分感激,,,目前没有办法对人物的感情 进行识别,,如有人做过音乐软件,,,类似唱吧的应用,,希望提供思路。。
**
首先你需要导入 CoreImage.framework 框架
然后我们先来看看3个主要的类:
CIContext:它与Core Graphics 和 OpenGL context类似,所有Core Image的处理流程都通过它来进行;
CIImage:它用来存放图片数据,可以通过UIImage,图片文件或像素数据创建;
CIFilter:通过它来定义过滤器的详细属性。
**
CIContext有两种初始化方法,分别对应GPU和CPU // 创建基于GPU的CIContext对象 context = [CIContext contextWithEAGLContext: options:]; // 创建基于CPU的CIContext对象 //context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]]; 一般采用第一种基于GPU的,因为效率要比CPU高很多,但是要注意的是基于GPU的CIContext对象无法跨应用访问。比如你打开UIImagePickerController要选张照片进行美化,如果你直接在UIImagePickerControllerDelegate的委托方法里调用CIContext对象进行处理,那么系统会自动将其降为基于CPU的,速度会变慢,所以正确的方法应该是在委托方法里先把照片保存下来,回到主类里再来处理
// 通过图片路径创建CIImage NSString *filePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]; NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath]; beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath]; 过滤周期就完成了,简单来说分以下几个步骤: 1 初始化CIContext,CIImage 2 初始化CIFilter并设置参数 3 得到输出的图片 4 将图片转化成能显示的UIImage类型 如果想一张图片有多种过滤效果就需要重复2,3两步,并且要将上一个过滤器输出的图片作为下一个过滤器的参数
滤镜信息介绍
按效果分类: kCICategoryDistortionEffect 扭曲效果,比如bump、旋转、hole kCICategoryGeometryAdjustment 几何开着调整,比如仿射变换、平切、透视转换 kCICategoryCompositeOperation 合并,比如源覆盖(source over)、最小化、源在顶(source atop)、色彩混合模式 kCICategoryHalftoneEffect Halftone效果,比如screen、line screen、hatched kCICategoryColorAdjustment 色彩调整,比如伽马调整、白点调整、曝光 kCICategoryColorEffect 色彩效果,比如色调调整、posterize kCICategoryTransition 图像间转换,比如dissolve、disintegrate with mask、swipe kCICategoryTileEffect 瓦片效果,比如parallelogram、triangle kCICategoryGenerator 图像生成器,比如stripes、constant color、checkerboard kCICategoryGradient 渐变,比如轴向渐变、仿射渐变、高斯渐变 kCICategoryStylize 风格化,比如像素化、水晶化 kCICategorySharpen 锐化、发光 kCICategoryBlur 模糊,比如高斯模糊、焦点模糊、运动模糊 按使用场景分类: kCICategoryStillImage 能用于静态图像 kCICategoryVideo 能用于视频 kCICategoryInterlaced 能用于交错图像 kCICategoryNonSquarePixels 能用于非矩形像素 kCICategoryHighDynamicRange 能用于HDR */
效果图:
代码如下:
- (void)viewDidLoad { [super viewDidLoad]; // 通过UIImage对象创建CIImage UIImage *image = [UIImage imageNamed:@"demo.jpg"]; CIImage *ciimage = [[CIImage alloc] initWithImage:image]; // 根据图片获取尺寸 CGRect rect = CGRectMake(0, 0, self.view.frame.size.width, image.size.height); // 初始化GPUView _gpuView = [[GPUView alloc] initWithFrame:rect]; [self.view addSubview:_gpuView]; [_gpuView drawCIImage:ciimage]; // 初始化第一个CIFilter 通过它来定义过滤器的详细属性。 // 第一行:指定使用哪一个过滤器, //通过[CIFilter filterNamesInCategory: kCICategoryBuiltIn]能得到所有过滤器的列表 _ciFilter1 = [CIFilter filterWithName:@"CISepiaTone"]; //第二行:指定需要处理的图片 [_ciFilter1 setValue:ciimage forKey:kCIInputImageKey]; // 第三行:指定过滤参数,每个过滤器的参数都不一样 //可以在官方文档里搜索“Core Image Filter Reference”查看 [_ciFilter1 setValue:@0 forKey:kCIInputIntensityKey]; // 初始化第二个CIFilter _ciFilter2 = [CIFilter filterWithName:@"CIHueAdjust"]; [_ciFilter2 setValue:[_ciFilter1 outputImage] forKeyPath:kCIInputImageKey]; [_ciFilter2 setValue:@0.f forKeyPath:kCIInputAngleKey]; // 初始化UISlider _slider1 = [[UISlider alloc] initWithFrame:CGRectMake(0, 50, 320, 20)]; [self.view addSubview:_slider1]; [_slider1 addTarget:self action:@selector(event1:) forControlEvents:UIControlEventValueChanged]; _slider1.minimumValue = 0; _slider1.maximumValue = 1; _slider1.value = 0.5f; _slider2 = [[UISlider alloc] initWithFrame:CGRectMake(0, 100, 320, 20)]; [self.view addSubview:_slider2]; [_slider2 addTarget:self action:@selector(event2:) forControlEvents:UIControlEventValueChanged]; _slider2.minimumValue = -3.14f; _slider2.maximumValue = +3.14f; _slider2.value = 0.f;} - (void)event1:(UISlider *)slider { [_ciFilter1 se e4bb tValue:[NSNumber numberWithFloat:_slider1.value] forKey:kCIInputIntensityKey]; [_ciFilter2 setValue:[_ciFilter1 outputImage] forKeyPath:kCIInputImageKey]; [_ciFilter2 setValue:[NSNumber numberWithFloat:_slider2.value] forKeyPath:kCIInputAngleKey]; [_gpuView drawCIImage:[_ciFilter2 outputImage]]; } - (void)event2:(UISlider *)slider { [_ciFilter1 setValue:[NSNumber numberWithFloat:_slider1.value] forKey:kCIInputIntensityKey]; [_ciFilter2 setValue:[_ciFilter1 outputImage] forKeyPath:kCIInputImageKey]; [_ciFilter2 setValue:[NSNumber numberWithFloat:_slider2.value] forKeyPath:kCIInputAngleKey]; [_gpuView drawCIImage:[_ciFilter2 outputImage]]; } //- (void)event:(UISlider *)slider //{ // [_ciFilter setValue:[NSNumber numberWithFloat:slider.value] // forKey:kCIInputIntensityKey]; // CIImage *outputImage = [_ciFilter outputImage]; // [_gpuView drawCIImage:outputImage]; //} //打印出所有可用滤镜信息 - (void)logAllFilters { NSArray *properties = [CIFilter filterNamesInCategory: kCICategoryBuiltIn]; NSLog(@"%@", properties); for (NSString *filterName in properties) { CIFilter *fltr = [CIFilter filterWithName:filterName]; NSLog(@"%@", [fltr attributes]); } } // - (CIImage *)oldPhoto:(CIImage *)img withAmount:(float)intensity { // 1 CIFilter *sepia = [CIFilter filterWithName:@"CISepiaTone"]; [sepia setValue:img forKey:kCIInputImageKey]; [sepia setValue:@(intensity) forKey:@"inputIntensity"]; // 2 CIFilter *random = [CIFilter filterWithName:@"CIRandomGenerator"]; // 3 CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"]; [lighten setValue:random.outputImage forKey:kCIInputImageKey]; [lighten setValue:@(1 - intensity) forKey:@"inputBrightness"]; [lighten setValue:@0.0 forKey:@"inputSaturation"]; // 4 CIImage *croppedImage = [lighten outputImage] ; return croppedImage; } @end
#import "ViewController.h" #import <CoreImage/CoreImage.h> #import "GPUView.h" @interface ViewController () @property (nonatomic, strong) CIFilter *ciFilter1; @property (nonatomic, strong) CIFilter *ciFilter2; @property (nonatomic, strong) GPUView *gpuView; @property (nonatomic, strong) UISlider *slider1; @property (nonatomic, strong) UISlider *slider2; @end
// // GPUView.m // OpenGL_ES_1 // // Created by fsk-0-1-n on 16/9/8. // Copyright © 2016年 Xoxo. All rights reserved. // #import "GPUView.h" @interface GPUView () @property (nonatomic, assign) CGRect rectInPixels; @property (nonatomic, strong) CIContext *context; @property (nonatomic, strong) GLKView *showView; @end @implementation GPUView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // 获取OpenGLES渲染环境 EAGLContext *eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; // 初始化GLKView并指定OpenGLES渲染环境 + 绑定 _showView = [[GLKView alloc] initWithFrame:frame context:eaglContext]; [_showView bindDrawable]; // 添加进图层 [self addSubview:_showView]; // 创建CIContext环境 _context = \ [CIContext contextWithEAGLContext:eaglContext options:@{kCIContextWorkingColorSpace:[NSNull null]}]; // 定义绘制区域(像素描述) _rectInPixels = \ CGRectMake(0.0, 0.0, _showView.drawableWidth, _showView.drawableHeight); } return self; } 你也可以把图片导入到手机相册 - (void)drawCIImage:(CIImage *)ciImage { // 开始绘制 [_context drawImage:ciImage inRect:_rectInPixels fromRect:[ciImage extent]]; //将CIImage转变为UIImage // CGImageRef cgimg = [_context createCGImage:ciImage fromRect:[ciImage extent]]; // UIImage *newImg = [UIImage imageWithCGImage:cgimg]; // CGImageRelease(cgimg); // 显示 [_showView display]; }
小弟最近正在研究语音识别,,,,,如有大神赐教,,万分感激,,,目前没有办法对人物的感情 进行识别,,如有人做过音乐软件,,,类似唱吧的应用,,希望提供思路。。
相关文章推荐
- iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
- iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)
- CSS3 滤镜 webkit-filter详细介绍及使用方法
- IOS App 无代码入侵的方法hook详细介绍
- IOS 开发APP之关于时间处理详细介绍
- 详细介绍mysql-bin.000001文件的来源及处理方法
- iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)
- IOS Bundle详细介绍及使用方法
- IOS 字符串常用处理详细介绍
- iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)
- php5编程中的异常处理详细方法介绍
- php5编程中的异常处理详细方法介绍
- 详细介绍mysql-bin.000001文件的来源及处理方法
- 介绍三种处理IIS中无法打开asp页面的方法
- 查看关闭端口的方法及计算机端口介绍[详细列表]
- 详细介绍ASP.NET状态保存方法
- 详细讲解Oracle物理结构故障的处理方法
- (HB.CN分享)详细介绍ASP.NET状态保存方法
- 详细介绍 Hibernate 泛型 DAO 及其使用方法
- firefox扩展插件制作方法详细介绍