关闭

CIFilter应用:多图叠加合成

标签: CIFilter滤镜图像合成iOS视频
202人阅读 评论(0) 收藏 举报
分类:

最近在编写一个鬼怪相机的程序。基本思路是通过摄像头捕获视频图像,然后加载一个准备好的鬼怪图片,将此图片进行随机缩放旋转平移后与视频图像合成,最后显示在屏幕上。当用户点击拍照按钮时,就将当前的合成图像存入照片库。

准备好的鬼怪图片:


下面是核心的图像合成代码:

func makeGhostWithCIImage(inputImage: CIImage) -> CIImage {
        let image = CIImage(contentsOfURL: NSBundle.mainBundle().URLForResource("ghost", withExtension: "png")!)!
        //随机缩放鬼怪图
        let filter = CIFilter(name: "CILanczosScaleTransform")!
        filter.setValue(image, forKey: "inputImage")
        let scale=CGFloat((arc4random_uniform(5)+3))/10.0
        filter.setValue(scale, forKey: "inputScale")
        filter.setValue(1.0, forKey: "inputAspectRatio")
        //随机移位和旋转鬼怪图
        let ghost=filter.outputImage!
        let extsz1=inputImage.extent.size
        let extsz2 = ghost.extent.size
        let w1=extsz1.width
        let h1=extsz1.height
        let w2=extsz2.width
        let h2=extsz2.height
        var trans = CGAffineTransformMakeTranslation(CGFloat(arc4random_uniform(UInt32(w1-w2-20))+10), CGFloat(arc4random_uniform(UInt32(h1-h2-20))+10))
        trans=CGAffineTransformRotate(trans, CGFloat(M_PI*2)*CGFloat(arc4random_uniform(361))/360.0)
        let filter2 = CIFilter(name: "CIAffineTransform")!
        filter2.setValue(ghost, forKey: "inputImage")
        filter2.setValue(NSValue(CGAffineTransform:trans), forKey: "inputTransform")
        //叠加视频图像和鬼怪图像
        let filter3 = CIFilter(name: "CISourceOverCompositing")!
        filter3.setValue(filter2.outputImage, forKey: "inputImage")
        filter3.setValue(inputImage, forKey: "inputBackgroundImage")
        
        return filter3.outputImage!
    }
函数的输入参数是摄像头捕获的视频图像,函数内部将鬼怪图片处理之后与视频图像合成为一张新图像并返回。然而当调试运行的时候,发现合成的图像不时发生扭曲变形的问题,特别是鬼怪图片靠近捕获视频图像边缘的时候。

程序运行过程中没有任何错误信息,通过分步检测代码,发现只要屏蔽鬼怪图片旋转的代码,图像显示就正常了。此时推测可能在旋转图片后,导致图片尺寸发生改变影响图像合成。决定在与视频图像合成前,重新定义鬼怪图片的尺寸,使其与视频图像尺寸一致,再进行合成。

根据结论,修改代码如下:

</pre><pre name="code" class="plain">//修改前
filter3.setValue(filter2.outputImage, forKey: "inputImage")
//修改后
filter3.setValue(filter2.outputImage?.imageByCroppingToRect(inputImage.extent), forKey: "inputImage")


再调试运行,一切正常。总结如下,对多张图像进行合成时,对大小不同的图像,如果可以尽量调整为同一尺寸再进行合成处理。









0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1655次
    • 积分:55
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档