裁剪CVPixelBufferRef

#pragma mark - 裁剪CVPixelBufferRef

 

-(CVPixelBufferRef)createBuffer:(CVPixelBufferRef)buffer rect:(CGRect)rect{

    CVPixelBufferLockBaseAddress(buffer, 0);

    size_t num=CVPixelBufferGetPlaneCount(buffer);

    void * address[num];

    size_t width[num];

    size_t height[num];

    size_t bytes[num];

    for (size_t i = 0; i != num; i++) {

        address[i] = CVPixelBufferGetBaseAddressOfPlane(buffer, i);

        width[i] = CVPixelBufferGetWidthOfPlane(buffer, i);

        height[i] = CVPixelBufferGetHeightOfPlane(buffer, i);

        bytes[i] = CVPixelBufferGetBytesPerRowOfPlane(buffer, i);

        size_t startpos = rect.origin.y * bytes[i] + rect.origin.x * (bytes[i] / width[i]);

        address[i] = address[i] + startpos / (bytes[i] / width[i]);

    }

    CVPixelBufferRef re = NULL;

    CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault, rect.size.width, rect.size.height, CVPixelBufferGetPixelFormatType(buffer), NULL, CVPixelBufferGetDataSize(buffer), num, address, width, height, bytes, NULL, NULL, NULL, &re);

    CVPixelBufferUnlockBaseAddress(buffer, 0);

    return re;

}

摘自:http://blog.sina.com.cn/s/blog_166944a2a0102xi79.html

猜你喜欢

转载自www.cnblogs.com/yuxiaoyiyou/p/12448589.html
今日推荐