【iOS開發(fā)】制作一個(gè)簡(jiǎn)易的濾鏡相機(jī)(四)

上一篇我們實(shí)現(xiàn)了拍照功能。接下來(lái)我們可以加上貼紙功能。貼紙不是簡(jiǎn)單的加一個(gè)Image View(不然這篇文章沒(méi)什么好寫了~),我們需要把加在攝像頭上的貼紙?jiān)阡浵窕蚺恼盏臅r(shí)候一起加到幀畫面上。

  1. 在.h文件中添加這次要用到的三個(gè)成員變量

     UIImage *_overlayImage;
     CGRect _overlayRect;
     CGColorSpaceRef _colorSpace;
    
  2. 在.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ì)用到。

  1. _colorSpace需要手動(dòng)釋放,把釋放動(dòng)作放在dealloc方法中:

     - (void)dealloc {
         CGColorSpaceRelease(_colorSpace);
     }
    
  2. 到willOutputSampleBuffer:中,先把上次的第一段代碼注釋掉,不然在不進(jìn)行拍照的情況下,這個(gè)方法走不下去。

  3. 到第三段代碼上方,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)系,然后把貼圖畫上去。

  1. 到了最關(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)題了。

  1. 看下效果吧。(這個(gè)貼圖是在吐槽的是某國(guó)人名字又長(zhǎng)又沒(méi)有規(guī)律。)


    圖片發(fā)自簡(jiǎn)書App

    好了,又一個(gè)主要功能點(diǎn)完成。下回再見(jiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容