iOS音视频(直播 音频 视频)iOS开发交流平台直播App

直播预览层添加滤镜效果(CIFilter使用场景)

2017-01-06  本文已影响2114人  袁峥

直播预览层添加滤镜效果

    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        
    // 转换为CIImage
    CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];
        
        
    NSArray *fiters = [ciImage autoAdjustmentFilters];
        
    NSLog(@"%@",fiters);
        CIFilter *fiter = [CIFilter filterWithName:@"CIPhotoEffectInstant"];
        
        [fiter setValue:ciImage forKey:@"inputImage"];
        
        ciImage = fiter.outputImage;

直播预览层添加滤镜效果步骤

if (_videoConnection == connection) {
        // 获取图片信息
        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        
        // 转换为CIImage
        CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];
        
        // 创建滤镜
        CIFilter *fiter = [CIFilter filterWithName:@"CIFaceBalance"];
        
        [fiter setValue:ciImage forKey:@"inputImage"];
        [fiter setValue:@100 forKey:@"inputStrength"];
        ciImage = fiter.outputImage;
        
        // 转换UIImage
        UIImage *image = [UIImage imageWithCIImage:ciImage];
        
        dispatch_sync(dispatch_get_main_queue(), ^{
            
            self.imageView.image = image;
            
        });
    }

通过GPU渲染图片显示

  // 获取图片信息
            CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
            
            // 转换为CIImage
            CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];
            
            // 创建滤镜
            CIFilter *fiter = [CIFilter filterWithName:@"CIPhotoEffectInstant"];
            
            [fiter setValue:ciImage forKey:@"inputImage"];
            
            ciImage = fiter.outputImage;
            
            EAGLContext *openglCtx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
            CIContext *ctx = [CIContext contextWithEAGLContext:openglCtx];
            
            CGImageRef imgRef = [ctx createCGImage:ciImage fromRect:ciImage.extent];
            
            UIImage *image = [UIImage imageWithCGImage:imgRef];
        
            // 用完了及时清空,否则内存溢出,造成程序崩溃.使用C语言的时候,需要特别注意内存管理.
            CGImageRelease(imgRef);
        
            // 转换UIImage
            
            dispatch_sync(dispatch_get_main_queue(), ^{
                
                self.imageView.image = image;
                
                
            });
内存溢出bug.png
CGImageRef imgRef = [ctx createCGImage:ciImage fromRect:ciImage.extent];
            
UIImage *image = [UIImage imageWithCGImage:imgRef];
        
// 用完了及时清空,否则内存溢出,造成程序崩溃.使用C语言的时候,需要特别注意内存管理.
CGImageRelease(imgRef);
坏内存访问.png
 @autoreleasepool {
            // 获取图片信息
            CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
            
            // 转换为CIImage
            CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];
            
            // 创建滤镜
            CIFilter *fiter = [CIFilter filterWithName:@"CIPhotoEffectInstant"];
            
            [fiter setValue:ciImage forKey:@"inputImage"];
            
            ciImage = fiter.outputImage;
        
            EAGLContext *openglCtx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
            CIContext *ctx = [CIContext contextWithEAGLContext:openglCtx];
            
            CGImageRef imgRef = [ctx createCGImage:ciImage fromRect:ciImage.extent];
            
            UIImage *image = [UIImage imageWithCGImage:imgRef];
        
            // 用完了及时清空,否则内存溢出,造成程序崩溃.使用C语言的时候,需要特别注意内存管理.
            CGImageRelease(imgRef);
        
            // 转换UIImage
            
            dispatch_sync(dispatch_get_main_queue(), ^{
                
                self.imageView.image = image;
                
            });

        }
        
    }
上一篇 下一篇

猜你喜欢

热点阅读