GPUImage 使用组合滤镜时直接使用 GPUImageFilterPipeline类来做组合滤镜. 使用组合滤镜的优势在于只会有一张图片内存的占用。如果一个一个做,🙄 等着被用户查水表吧. 内存真的会爆.
我拿一个调整饱和度和对比度的组合滤镜来做介绍 ,使用方式如下:
初始化 图片
GPUImagePicture *staticPicture = [[GPUImagePicture alloc]initWithImage:chooseImage smoothlyScaleOutput:YES];
创建组合滤镜 :与单一创建滤镜没有任何不同,只是把创建的所有的滤镜对象存在下方数组,然后GPUImageFilterPipeline就会根据数组中对象做对应的滤镜操作
GPUImageSaturationFilter*saturationfilter = [[GPUImageSaturationFilter alloc]init];
GPUImageContrastFilter*contrastfilter = [[GPUImageContrastFilteralloc]init];
saturationfilter1.saturation=0; 参数自己调
contrastfilter.contrast=1.4;
NSMutableArray *filterArray =[NSMutableArray array];
[filterArray addObject:saturationfilter];
[filterArray addObject:contrastfilter];
做组合滤镜的关键类GPUImageFilterPipeline 关于output 为GPUImageView(图片渲染后的显示容器) 如果你的UIImageView 对象已经创建好了 那么直接置为nil就好,如果你想直接使用GPUImageView 那么直接创建一个GPUImageView的对象就好 图片也会直接显示在GPUImageView的对象上
input为被渲染的输入源,一般为GPUImagePicture/VodioCamera对象 output为输出源上方已经介绍 filters为滤镜数组
GPUImageFilterPipeline *filterPipeline = [[GPUImageFilterPipeline alloc ]initWithOrderedFilters:filterArray input:staticPictureoutput:nil];
渲染图片
[staticPicture processImage];
[contrastfilter useNextFrameForImageCapture];
获取图片
UIImage *filterImage = [filterPipeline currentFilteredFrame]
//最后最后 最重要的 : GPUImageView不会自动释放 (ARC)
获取到图片后执行:
[[GPUImageContext sharedImageProcessingContext].framebufferCache purgeAllUnassignedFramebuffers]; 就会释放内存了.
网友评论