iOS给图片添加滤镜&使用openGLES动态渲染图片详解及实例
iOS给图片添加滤镜&使用openGLES动态渲染图片
给图片增加滤镜有这两种方式:CoreImage/openGLES
下面先说明如何使用CoreImage给图片添加滤镜,主要为以下步骤:
#1.导入CIImage格式的原始图片
#2.创建CIFilter滤镜
#3.用CIContext将滤镜中的图片渲染出来
#4.导出渲染后的图片
参考代码:
//导入CIImage CIImage*ciImage=[[CIImagealloc]initWithImage:[UIImageimageNamed:@"hua"]]; //创建出Filter滤镜 CIFilter*filter=[CIFilterfilterWithName:@"CIPixellate"]; [filtersetValue:ciImageforKey:kCIInputImageKey]; [filtersetDefaults]; CIImage*outImage=[filtervalueForKey:kCIOutputImageKey]; //用CIContext将滤镜中的图片渲染出来 CIContext*context=[CIContextcontextWithOptions:nil]; CGImageRefcgImage=[contextcreateCGImage:outImage fromRect:[outImageextent]]; //导出图片 UIImage*showImage=[UIImageimageWithCGImage:cgImage]; CGImageRelease(cgImage); UIImageView*imageView=[[UIImageViewalloc]initWithImage:showImage]; imageView.center=self.view.center; [self.viewaddSubview:imageView];
当要设置多个滤镜的时候,出了新创建一个CIFilter外还要额外设定kCIInputAngleKey,代码如下:
//导入CIImage CIImage*ciImage=[[CIImagealloc]initWithImage:[UIImageimageNamed:@"hua.jpeg"]]; //创建出Filter滤镜 CIFilter*filter=[CIFilterfilterWithName:@"CIPixellate"]; [filtersetValue:ciImageforKey:kCIInputImageKey]; [filtersetDefaults]; CIImage*outImage=[filtervalueForKey:kCIOutputImageKey]; CIFilter*filterTwo=[CIFilterfilterWithName:@"CIHueAdjust"]; [filterTwosetValue:outImageforKey:kCIInputImageKey]; [filterTwosetDefaults]; [filterTwosetValue:@(1.0f)forKey:kCIInputAngleKey];//如果不增加这行新增的滤镜不会生效 CIImage*outputImage=[filterTwovalueForKey:kCIOutputImageKey]; //用CIContext将滤镜中的图片渲染出来 CIContext*context=[CIContextcontextWithOptions:nil]; CGImageRefcgImage=[contextcreateCGImage:outputImage fromRect:[outputImageextent]]; //导出图片 UIImage*showImage=[UIImageimageWithCGImage:cgImage]; CGImageRelease(cgImage); UIImageView*imageView=[[UIImageViewalloc]initWithImage:showImage]; imageView.center=self.view.center; [self.viewaddSubview:imageView];
下面来介绍怎么用openGLES来使用滤镜渲染图片
使用openGlES的步骤大致如下:
#1.导入要渲染的图片
#2.获取OpenGLES渲染的上下文
#3.创建出渲染的GLKViewbuffer
#4.创建CoreImage的上下文
#5.进行CoreImage的相关设置
#6.开始渲染并显示图片
参考代码如下:
//导入要渲染的图片 UIImage*showImage=[UIImageimageNamed:@"hua.jpeg"]; CGRectrect=CGRectMake(0,0,showImage.size.width,showImage.size.height); //获取OpenGLES渲染的上下文 EAGLContext*eagContext=[[EAGLContextalloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]; //创建出渲染的buffer GLKView*glkView=[[GLKViewalloc]initWithFrame:rect context:eagContext]; [glkViewbindDrawable]; [self.viewaddSubview:glkView]; //创建出CoreImage的上下文 CIContext*ciContext=[CIContextcontextWithEAGLContext:eagContext options:@{kCIContextWorkingColorSpace:[NSNullnull]}]; //CoreImage相关设置 CIImage*ciImage=[[CIImagealloc]initWithImage:showImage]; CIFilter*filter=[CIFilterfilterWithName:@"CISepiaTone"]; [filtersetValue:ciImageforKey:kCIInputImageKey]; [filtersetValue:@(0)forKey:kCIInputIntensityKey]; //开始渲染 [ciContextdrawImage:[filtervalueForKey:kCIOutputImageKey] inRect:CGRectMake(0,0,glkView.drawableWidth,glkView.drawableHeight) fromRect:[ciImageextent]]; [glkViewdisplay];
如果要动态渲染,可以通过UISilder动态调整一下代码的vaule值
[filtersetValue:vauleforKey:kCIInputIntensityKey];
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!