上一篇我們實(shí)現(xiàn)了拍照功能。接下來(lái)我們可以加上貼紙功能。貼紙不是簡(jiǎn)單的加一個(gè)Image View(不然這篇文章沒(méi)什么好寫了~),我們需要把加在攝像頭上的貼紙?jiān)阡浵窕蚺恼盏臅r(shí)候一起加到幀畫面上。
-
在.h文件中添加這次要用到的三個(gè)成員變量
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:的最后會(huì)用到。
-
_colorSpace需要手動(dòng)釋放,把釋放動(dòng)作放在dealloc方法中:
- (void)dealloc { CGColorSpaceRelease(_colorSpace); }
到willOutputSampleBuffer:中,先把上次的第一段代碼注釋掉,不然在不進(jìn)行拍照的情況下,這個(gè)方法走不下去。
-
到第三段代碼上方,
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)整一下坐標(biāo)系,然后把貼圖畫上去。
-
到了最關(guān)鍵的步驟了。做完對(duì)幀畫面的一系列處理以后,要寫回image buffer里面。我們可以用CIContext的渲染方法來(lái)實(shí)現(xiàn)。到
willOutputSampleBuffer:
最后一行代碼
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
的上方插入以下代碼:CIImage *filteredImage = [[CIImage alloc] initWithCGImage:resultImage.CGImage]; [_ciContext render:filteredImage toCVPixelBuffer:imageBuffer bounds:_sourceRect colorSpace:_colorSpace];
這里要注意初始化CIImage的時(shí)候不能直接用UIImage,會(huì)返回空值。至于為什么……我也不明白。不過(guò)既然可以用CGImage初始化,也沒(méi)有什么大問(wèn)題了。
-
看下效果吧。(這個(gè)貼圖是在吐槽的是某國(guó)人名字又長(zhǎng)又沒(méi)有規(guī)律。)
圖片發(fā)自簡(jiǎn)書App
好了,又一個(gè)主要功能點(diǎn)完成。下回再見(jiàn)。