iOS图片美颜

使用GPUImage做美颜非常方便,内置已经提供了一个GPUImagePicture作为图片输入Filter。

GPUImagePicture的实现方法是读取图片数据,将其写入到GPUImageFramebuffer,是一种非常高效的方案。我的方案是将image转为CMSampleBufferRef,这样就能复用视频的处理代码。转换代码如下

- (CVPixelBufferRef)pixelBufferFromUIImage:(UIImage *)image {
    CGSize frameSize = CGSizeMake(CGImageGetWidth(image.CGImage),CGImageGetHeight(image.CGImage));
    NSDictionary *options =
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kCVPixelBufferCGImageCompatibilityKey,
     [NSNumber numberWithBool:YES],kCVPixelBufferCGBitmapContextCompatibilityKey,
     [NSDictionary dictionary], (id)kCVPixelBufferIOSurfacePropertiesKey, nil];
    CVPixelBufferRef pxbuffer = NULL;
    int cropWidth = (int)CGImageGetWidth(image.CGImage) & ~15;
    int cropHeight = (int)CGImageGetHeight(image.CGImage) & ~1;
    CVReturn status =
    CVPixelBufferCreate(kCFAllocatorDefault, cropWidth, cropHeight, kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)options, &pxbuffer);
    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata, cropWidth, cropHeight,8, CVPixelBufferGetBytesPerRow(pxbuffer),rgbColorSpace,(CGBitmapInfo)kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(context, CGRectMake(0, 0, cropWidth, cropHeight), image.CGImage);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);
    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
    return pxbuffer;
}

有个坑的地方是,在后面处理的时候会遇到CVOpenGLESTextureCacheCreateTextureFromImage返回-6638错误,看了官方文档才找到解决方案 https://developer.apple.com/library/archive/qa/qa1781/_index.html

上效果图


fu.gif
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这边宿舍里,顾莹洗漱回来知道郑蓉去找程清扬了,更加的气愤,对着易灵犀和周青青说:“你们说,郑蓉是不是脑子有...
    贝雷帽的春天阅读 2,607评论 0 1
  • 互联网产品越来越同质化的今天,运营成了企业杀出重围,出奇制胜的法宝。而随着一些互联网公司因为一些高明运营策略而大放...
    64e4f95b2484阅读 3,741评论 0 1
  • 十天的主题营就结束了,前几天我还在小群里说我觉得每天都觉得很紧张、很辛苦,可是突然发现怎么就结束了呢?加入主题营之...
    我渴望的元白阅读 1,495评论 1 2
  • 写作和演讲是两种很重要的个人成长技能,写作需要日积月累,演讲也是有技巧可循的。 1.实话实说 想要迅速赢得听众的信...
    饼姑娘阅读 1,612评论 2 4