利用coreImage croppedSampleBuffer

CoreImage的使用及常见滤镜工具

        glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        context = [CIContext contextWithEAGLContext:glContext];
-(CVPixelBufferRef)croppedSampleBuffer:(CMSampleBufferRef)sampleBuffer targetSize:(CGSize)targetSize
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    if (shouldChangeTransform)
    {
        CGSize imageSize = CVImageBufferGetEncodedSize(imageBuffer);
        CGSize rotatedSize ={imageSize.height,imageSize.width};
        CGFloat shorterSize = (rotatedSize.width < rotatedSize.height) ? rotatedSize.width : rotatedSize.height;
        
        rotateTransform =CGAffineTransformMakeTranslation(imageSize.width / 2.0,imageSize.height / 2.0);
        rotateTransform =CGAffineTransformRotate(rotateTransform, - pi / 2.0);
        rotateTransform =CGAffineTransformTranslate(rotateTransform, -imageSize.height / 2.0,-imageSize.width / 2.0);
        
        CGFloat scale = targetSize.width / shorterSize;
        scaleTransform = CGAffineTransformMakeScale(scale,scale);
        
        CGFloat xDiff = rotatedSize.width * scale - targetSize.width;
        CGFloat yDiff = rotatedSize.height * scale - targetSize.height;
        cropTransform = CGAffineTransformMakeTranslation(xDiff/2.0,yDiff/2.0);
        
        CVPixelBufferCreate(kCFAllocatorDefault, targetSize.width, targetSize.height, kCVPixelFormatType_32BGRA, nil, &resultBuffer);
        
        shouldChangeTransform =NO;
    }
    CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];
    CIImage *rotated = [ciImage imageByApplyingTransform:rotateTransform];
    CIImage *scaled = [rotated imageByApplyingTransform:scaleTransform];
    CIImage *cropped = [scaled imageByApplyingTransform:cropTransform];
    
    [context render:cropped toCVPixelBuffer:resultBuffer];
    return resultBuffer;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容