CIFilter应用:多图叠加合成

原创 2016年05月30日 16:22:14

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

准备好的鬼怪图片:


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

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")


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









版权声明:本文为博主原创文章,未经博主允许不得转载。

CIFilter 处理图片

在这个教程中,你将学习最新的Core Image过滤技术,亲身体验如何应用一些不同的滤镜来实时地产生各种神奇的效果。 Core Image是一个很强大的框架。它可以让你简单地应用各种滤镜来处理图...
  • u014600626
  • u014600626
  • 2016年10月13日 13:50
  • 417

iOS图片编辑(CIFilter)

在iOS中开发过程中,如果你想对图片进行简单的处理,那么很简单,苹果帮我们封装了一套简单易用的API——CIFilter。 使用CIFilter你可以做到:调节图片亮度、对比度、饱和度等图片基本的...
  • xsl_bj
  • xsl_bj
  • 2015年11月30日 11:23
  • 811

CIFilter的种类

//Iphone中目前可用的      CIAdditionCompositing     //影像合成     CIAffineTransform           //仿射变换 ...
  • qq_22981537
  • qq_22981537
  • 2016年09月09日 14:56
  • 911

CIFilter的使用方法.

这是iOS6盛宴中的第八个教程。 在这个教程中,你将学习最新的Core Image过滤技术。本教程部分内容出自iOS5教程和iOS6教程 中Jake Gundersen写的三个有关Core I...
  • samrtian
  • samrtian
  • 2016年05月04日 19:06
  • 640

CIFilter的使用方法

初学iOS6 中的Core Image技术 这篇文章还可以在这里找到 英语 Tweet If you're new here, you may want to subscribe...
  • xuchaovip
  • xuchaovip
  • 2014年07月18日 09:17
  • 707

iOS CoreImage专题(三)—— 自定义滤镜

iOS CoreImage专题, 自定义滤镜
  • u013282174
  • u013282174
  • 2015年12月01日 14:18
  • 2015

二维码生成(CIFilter生成二维码,清晰度高的二维码,自定义颜色的二维码,带logo的二维码)

效果如下: ViewController.h 1 #import 2 @interface ViewController : UIViewController 3 @property (st...
  • ai_pple
  • ai_pple
  • 2016年03月21日 15:04
  • 1339

[iOS] 使用CIColorCube快速製作濾鏡

如果想要再iOS的App內製作照片濾鏡,可以使用Core Image Framework內一系列的CIFilter來實作。CIFilter提供了可以調整亮度、對比等等各種特效的濾鏡。不過如果能直接用P...
  • shaobo8910
  • shaobo8910
  • 2015年12月03日 20:37
  • 1282

baidu地图API叠加自定义图层(三)- 通过切片实现图层叠加

baidu地图API叠加自定义图层(三)- 通过切片实现图层叠加
  • educast
  • educast
  • 2017年05月11日 20:35
  • 893

ArcGIS教程:加权叠加

使用常用测量比例叠加多个栅格数据,并根据各栅格数据的重要性分配权重。...
  • u010687924
  • u010687924
  • 2015年07月08日 16:36
  • 1179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CIFilter应用:多图叠加合成
举报原因:
原因补充:

(最多只允许输入30个字)