iOS开发 - CoreImage 初出茅庐

组合滤镜

熟悉下函数式编程思想

下面BFilter里面代码参考自functional-swift一书

Simulator Screen Shot 2016年9月8日.png

BFilter.swift

import UIKit

// MARK: - 组合滤镜 - 事例
typealias Filter = CIImage -> CIImage //构建了Filter 类型
struct BFilter {
    // 模糊 - 高斯模糊
    func blur(radius: Double) -> Filter {
        return { image in
            let parameters = [
                kCIInputRadiusKey: radius,
                kCIInputImageKey: image
            ]
            guard let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters) else {
                fatalError()
            }
            guard let outputImage = filter.outputImage else {
                fatalError()
            }
            return outputImage
        }
    }
    
    //生成固定颜色的滤镜
    func colorGenerator(color: UIColor) -> Filter {
        return { _ in
            let c = CIColor(color: color)
            let parameters = [kCIInputColorKey: c]
            guard let filter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: parameters) else {
                fatalError()
            }
            guard let outputImage = filter.outputImage else {
                fatalError()
            }
            return outputImage
        }
    }
    
    func compositeSourceOver(overlay: CIImage) -> Filter {
        return { image in
            let parameters = [
                kCIInputBackgroundImageKey: image,
                kCIInputImageKey: overlay
            ]
            guard let filter = CIFilter(name: "CISourceOverCompositing",    withInputParameters: parameters) else {
                fatalError()
            }
            guard let outputImage = filter.outputImage else {
                fatalError()
            }
            let cropRect = image.extent
            return outputImage.imageByCroppingToRect(cropRect)
        }
    }
    
    func colorOverlay(color: UIColor) -> Filter {
        return { image in
            let overlay = self.colorGenerator(color)(image)
            return self.compositeSourceOver(overlay)(image)
        }
    }
    
    func composeFilters(filter1: Filter, _ filter2: Filter) -> Filter {
        return { image in
            filter2(filter1(image))
        }
    }
}

//自定义运算符
infix operator +++ { associativity left }

func +++ (filter1: Filter, filter2: Filter) -> Filter {
    return { image in filter2(filter1(image)) }
}

extension CIImage {
    //扩展下方便点语法使用
    func filters(myFilter: Filter) -> CIImage {
        return myFilter(self)
    }
}

使用ViewController.swift

import UIKit

class SecondViewController: UIViewController {
    
    
    @IBOutlet var colorButtonCollection: [UIButton]! {
        didSet {
            colorButtonCollection.forEach {
                $0.layer.cornerRadius = $0.frame.width/2
            }
        }
    }
    
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var blurSlider: UISlider!
    
    lazy var originalImage:UIImage = {
        return UIImage(named: "beauty2")
        }()!
    
    lazy var overlayColor:UIColor = {
       return UIColor.purpleColor().colorWithAlphaComponent(0.2)
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
    @IBAction func sliderClick(sender: UISlider) {
        let inputImage = CIImage(image: originalImage)!
        let Filter = BFilter()
        let myFilter = Filter.blur(Double(sender.value)) +++ Filter.colorOverlay(overlayColor)
        let outputImage = inputImage.filters(myFilter)
        imageView.image = UIImage(CIImage: outputImage)
    }
    
    @IBAction func colorButtonClick(sender: UIButton) {
        let btnText = sender.titleLabel?.text
        var selectColor:UIColor!
        switch btnText! {
        case "黑":
            selectColor = UIColor.redColor()
        case "橙":
            selectColor = UIColor.orangeColor()
        case "紫":
            selectColor = UIColor.purpleColor()
        case "红":
            selectColor = UIColor.redColor()
        case "蓝":
            selectColor = UIColor.blueColor()
        case "绿":
            selectColor = UIColor.greenColor()
        default:
            break
        }
        overlayColor = selectColor.colorWithAlphaComponent(0.2)
        sliderClick(blurSlider)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,303评论 4 61
  • 【编者按】本文作者 Yegor Bugayenko 是 Teamed.io 公司的联合创始人,在软件质量和工程管理...
    OneAPM阅读 425评论 0 1
  • 青钢影·卡蜜尔是英雄联盟第134位英雄。 一位优雅的特工精英,一台精密的人形兵器,游走于法律已然失效的边缘地带,小...
    未陌生过阅读 901评论 0 5
  • 已经晚上10点了,五月关掉电脑,伸了伸坐了一天,早已僵硬的身体,轻叹了一口气,又要回家了呢! 办公室里早已没有了同...
    六玄月阅读 835评论 3 4
  • :用于数据组件的状态数据发生改变时,试图组建能动态更新自己 iOS应用通常会把应用程序组建分开为 数据模型组件:负...
    nalis风阅读 253评论 0 0