一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

ios开发之Swift实现抠图,及图片合成功能的实现

时间:2015-10-21 编辑:简简单单 来源:一聚教程网

大家肯定都用过PS进行抠图(扣图),而在Swift中,使用代码也可以实现抠图功能。

1,要把一个人物或物体从背景中抠出来,通常有两种办法:

(1)使用CoreImage色域:适合纯色背景(或者背景色相对单一,色差不会太大),抠图精准

 

(2)使用openCv边缘检测:复杂背景情况也适用,默认抠图不够精确

 

 

 

2,下面使用第一种方案把下面的小猫抠出来,放置到雪地背景上。

 

原文:Swift - 抠图,及图片合成功能的实现(适用于纯色背景) 原文:Swift - 抠图,及图片合成功能的实现(适用于纯色背景)

 

 

 

3,如何使用Core Image抠图

对于纯色背景,可以直接把背景色给消除,这样剩下的便是主体了。要消除背景色,可以使用CIColorCube滤镜。
而CIColorCube滤镜需要一张cube映射表,这张表其实就是张颜色表(3D颜色查找表),把你想消除的颜色的alpha值设置为0,其他的颜色不变,Core Image将会把图像数据上的颜色映射为表中的颜色,以此来达到消除某种颜色的目的。

 

 

4,代表颜色值区域的HSV(Hue值)图

 


原文:Swift - 抠图,及图片合成功能的实现(适用于纯色背景)

通过这个可以很方便的查看RGB颜色对应的HSV值。比如小猫背景都是蓝色的(只不过深浅不一),我们只需要把HSV在210到240这段颜色去处即可。

 

 

5,下面是样例效果图

 

为便于比较,我这边分别做了“只抠图”,以及“抠图并更换背景”两个功能。(真是毫无PS痕迹)

 


原文:Swift - 抠图,及图片合成功能的实现(适用于纯色背景)

 

 

 

6,代码如下:

 

(1)首先创建Cube Map表

 

新建一个“C File”文件CubeMap.c,会Xcode会自动生成对应的头文件CubeMap.h,还有连接头文件(Bridging Header文件)。各文件里代码如下:


6,代码如下:
(1)首先创建Cube Map表
新建一个“C File”文件CubeMap.c,会Xcode会自动生成对应的头文件CubeMap.h,还有连接头文件(Bridging Header文件)。各文件里代码如下:

import UIKit
 
class ViewController: UIViewController{
    
    @IBOutlet weak var imageView: UIImageView!
    
    //图片原图
    lazy var originalImage: UIImage = {
        return UIImage(named: "cat.jpg")
    }()!
    
    lazy var context: CIContext = {
        return CIContext(options: nil)
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        imageView.image = originalImage
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    //抠图
    @IBAction func cutOut(sender: AnyObject) {
        let cubeMap = createCubeMap(210,240)
        let data = NSData(bytesNoCopy: cubeMap.data, length: Int(cubeMap.length),
            freeWhenDone: true)
        
        //消除某种颜色
        let colorCubeFilter = CIFilter(name: "CIColorCube")!
        colorCubeFilter.setValue(cubeMap.dimension, forKey: "inputCubeDimension")
        colorCubeFilter.setValue(data, forKey: "inputCubeData")
        colorCubeFilter.setValue(CIImage(image: originalImage), forKey: kCIInputImageKey)
        let outputImage = colorCubeFilter.outputImage
       
        let cgImage = context.createCGImage(outputImage!, fromRect: outputImage!.extent)
        imageView.image = UIImage(CGImage: cgImage)
    }
    
    //抠图并合成
    @IBAction func cutOutAndCompose(sender: AnyObject) {
        let cubeMap = createCubeMap(210,240)
        let data = NSData(bytesNoCopy: cubeMap.data, length: Int(cubeMap.length),
            freeWhenDone: true)
        
        //消除某种颜色
        let colorCubeFilter = CIFilter(name: "CIColorCube")!
        colorCubeFilter.setValue(cubeMap.dimension, forKey: "inputCubeDimension")
        colorCubeFilter.setValue(data, forKey: "inputCubeData")
        colorCubeFilter.setValue(CIImage(image: originalImage), forKey: kCIInputImageKey)
        var outputImage = colorCubeFilter.outputImage
        
        //与背景图合成
        let sourceOverCompositingFilter = CIFilter(name: "CISourceOverCompositing")!
        sourceOverCompositingFilter.setValue(outputImage, forKey: kCIInputImageKey)
        sourceOverCompositingFilter.setValue(CIImage(image: UIImage(named: "bg.jpg")!),
            forKey: kCIInputBackgroundImageKey)
        outputImage = sourceOverCompositingFilter.outputImage
        
        let cgImage = context.createCGImage(outputImage!, fromRect: outputImage!.extent)
        imageView.image = UIImage(CGImage: cgImage)
    }
    
    //还原图片
    @IBAction func resetImage(sender: AnyObject) {
        self.imageView.image = originalImage
    }
}

热门栏目