为图像添加滤镜 Swift

Adding Filter To Images Swift

我正在制作一个简单的程序,为图像添加滤镜并 运行 解决那里的一些问题。问题是什么

  1. 速度很慢。
  2. 滚动浏览 UI 中的过滤器时会抛出异常。

致命错误:在展开可选值时意外发现 nil

See the Image for description

下面是我写的最终代码

//
//  ViewController.swift
//  ImageManipulationWithSwift
//
//  Created by Salman Ali on 01/03/2017.
//  Copyright © 2017 Antzion. All rights reserved.
//

import UIKit
import CoreImage


class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

var pickerFilters: [String] = [String]()
let path = Bundle.main.path(forResource: "scientist", ofType: "jpg")!

@IBOutlet weak var filterPicker: UIPickerView!
@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {

    super.viewDidLoad()
    let categFilters = CIFilter.filterNames(inCategory: kCICategoryColorEffect)

    //pickerFilters.append("CISepiaTone")
    for f in categFilters{
        pickerFilters.append(f)
    }
    filterPicker.dataSource = self
    filterPicker.delegate = self
    applyFilter(index: 0)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

func applyFilter(index: Int){
    let context = CIContext()
    // 1
    //below two lines will refer the code to GPU instead of cpu
    //let openGLContext = EAGLContext(api: .openGLES2)
    //let context = CIContext(eaglContext: openGLContext!)
    let filter = CIFilter(name: pickerFilters[index])!
    // 2

    //filter.setValue(0.8, forKey: kCIInputIntensityKey)
    let image = CIImage(contentsOf: URL(fileURLWithPath: path))                          // 3
    filter.setValue(image, forKey: kCIInputImageKey)
    let result = filter.outputImage!                                    // 4
    let cgImage = context.createCGImage(result, from: result.extent)    // 5
    //load this image to imageview
    imageView.image = UIImage(cgImage: cgImage!)
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerFilters.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    self.applyFilter(index: row)
    return pickerFilters[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

}


}

只使用一个过滤器时效果很好。但是当我想向用户显示一个列表然后让他选择他喜欢的过滤器时,它崩溃了。请帮我看看我该怎么办?

问题出在您的委托实现上:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    self.applyFilter(index: row)
    return pickerFilters[row]
}

调用此方法是为了获取要为选择器中的每个选项显示的标题。为要显示的选择器视图中的每个项目调用它。您似乎正在尝试同时将滤镜应用于图像。我不认为这是你想要做的。