为图像添加滤镜 Swift
Adding Filter To Images Swift
我正在制作一个简单的程序,为图像添加滤镜并 运行 解决那里的一些问题。问题是什么
- 速度很慢。
- 滚动浏览 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]
}
调用此方法是为了获取要为选择器中的每个选项显示的标题。为要显示的选择器视图中的每个项目调用它。您似乎正在尝试同时将滤镜应用于图像。我不认为这是你想要做的。
我正在制作一个简单的程序,为图像添加滤镜并 运行 解决那里的一些问题。问题是什么
- 速度很慢。
- 滚动浏览 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]
}
调用此方法是为了获取要为选择器中的每个选项显示的标题。为要显示的选择器视图中的每个项目调用它。您似乎正在尝试同时将滤镜应用于图像。我不认为这是你想要做的。