上一篇我們實現(xiàn)了拍照功能。接下來我們可以加上貼紙功能熏纯。貼紙不是簡單的加一個Image View(不然這篇文章沒什么好寫了~),我們需要把加在攝像頭上的貼紙在錄像或拍照的時候一起加到幀畫面上掺涛。
-
在.h文件中添加這次要用到的三個成員變量
UIImage *_overlayImage; CGRect _overlayRect; CGColorSpaceRef _colorSpace;
-
在.m文件viewDidLoad中最后一行之后加上:
_colorSpace = CGColorSpaceCreateDeviceRGB(); // 7. Setup overlay image _overlayImage = [UIImage imageNamed:@"image"]; _overlayRect = CGRectMake(-_overlayImage.size.width / 2.f, -_overlayImage.size.height / 2.f, _overlayImage.size.width, _overlayImage.size.height);
不要忘記找一張圖拖入工程中巴席。
_colorSpace的作用在willOutputSampleBuffer:的最后會用到。
-
_colorSpace需要手動釋放扭倾,把釋放動作放在dealloc方法中:
- (void)dealloc { CGColorSpaceRelease(_colorSpace); }
到willOutputSampleBuffer:中淀零,先把上次的第一段代碼注釋掉,不然在不進行拍照的情況下膛壹,這個方法走不下去驾中。
-
到第三段代碼上方,
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
之前的一行中插入以下代碼:// draw overlay image CGContextRotateCTM(context, M_PI_2); CGContextTranslateCTM(context, _sourceRect.size.height / 2.f, -_sourceRect.size.width / 2.f); CGContextDrawImage(context, _overlayRect, _overlayImage.CGImage);
作用是把畫布調(diào)整一下坐標系模聋,然后把貼圖畫上去肩民。
-
到了最關(guān)鍵的步驟了。做完對幀畫面的一系列處理以后撬槽,要寫回image buffer里面此改。我們可以用CIContext的渲染方法來實現(xiàn)。到
willOutputSampleBuffer:
最后一行代碼
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
的上方插入以下代碼:CIImage *filteredImage = [[CIImage alloc] initWithCGImage:resultImage.CGImage]; [_ciContext render:filteredImage toCVPixelBuffer:imageBuffer bounds:_sourceRect colorSpace:_colorSpace];
這里要注意初始化CIImage的時候不能直接用UIImage侄柔,會返回空值共啃。至于為什么……我也不明白占调。不過既然可以用CGImage初始化,也沒有什么大問題了移剪。
-
看下效果吧究珊。(這個貼圖是在吐槽的是某國人名字又長又沒有規(guī)律。)
圖片發(fā)自簡書App
好了纵苛,又一個主要功能點完成剿涮。下回再見。