Swift无法从UIImage中删除CIFIlter

我现在一直在研究swift,并且在处理这个核心图像框架时遇到了麻烦。 我能够在图像上成功创建CIFilter但是我不确定如何删除它。 图像被放置在类似于Snapchat的相机屏幕的UIView上,然后有一个图像视图,它是预览图像的uiview的子视图。 BTW使用最新版本的Xcode和iOS。

以下是应用黑白滤镜时的代码:

@IBAction func BW_Flt_Bt_Tapped(sender: UIButton) { let beginImage = CIImage(image: imagePreview.image!) let ciContext = CIContext(options: nil) let filter = CIFilter(name: "CIPhotoEffectNoir") var imgOrientation = imagePreview.image!.imageOrientation var imgScale = imagePreview.image?.scale filter!.setDefaults() filter!.setValue(beginImage, forKey: kCIInputImageKey) let filteredImageData = filter!.valueForKey(kCIOutputImageKey) as! CIImage let filteredImageRef = ciContext.createCGImage(filteredImageData, fromRect: filteredImageData.extent) imagePreview.image = UIImage(CGImage: filteredImageRef, scale: 1.0, orientation: UIImageOrientation.Right) self.orgImgBt.hidden = false self.orgImgL.hidden = false BWFlt.hidden = true BWLbl.hidden = true } 

-imagePreview是UIView的子视图

接下来是我的代码,了解如何更改图像

 @IBAction func orgImgPressed(sender: UIButton) { self.imagePreview.image = self.selctedImage orgImgBt.hidden = true orgImgL.hidden = true `enter code here` BWFlt.hidden = false `enter code here`BWLbl.hidden = false print("button was pressed") } 

如果有人有任何建议我会非常感激,谢谢!

您可以通过将先前值保留在变量中,或者如果您有多个filter将这些值保留在字典中,则可以执行此操作。 当您应用新filter或更改现有filter的值时,只需将该值替换为新值并将所有值应用于原始CIImage

例如,

  var allFilters = [String: [String: Any]]() var currentImage: CIImage! let kCIColorControls = "CIColorControls" override func viewDidLoad() { super.viewDidLoad() currentImage = CIImage(image: self.originalImage!) } func applyAvailableFilters() { if self.allFilters.count > 0 { DispatchQueue.global(qos: .background).async { var outputImage: CIImage! self.blurFilter = CIFilter.init(name: "CIGaussianBlur") self.brightnessFilter = CIFilter.init(name: "CIColorControls") self.cropFilter = CIFilter.init(name: "CICrop") if let blurProperty = self.allFilters[self.kCIGaussianBlur]?.first { self.blurFilter.setValue(blurProperty.value, forKey: blurProperty.key) self.blurFilter.setValue(self.currentImage, forKey: kCIInputImageKey) outputImage = self.blurFilter.outputImage } if let brightnessProperty = self.allFilters[self.kCIColorControls]?.first { self.brightnessFilter.setValue(brightnessProperty.value, forKey: brightnessProperty.key) if let outputImage = self.blurFilter.outputImage { self.brightnessFilter.setValue(outputImage, forKey: kCIInputImageKey) } else { self.brightnessFilter.setValue(self.currentImage, forKey: kCIInputImageKey) } outputImage = self.brightnessFilter.outputImage } if let cropProperty = self.allFilters[self.kCICrop]?.first { self.cropFilter.setValue(cropProperty.value, forKey: cropProperty.key) if let outputImage = self.brightnessFilter.outputImage { self.cropFilter.setValue(outputImage, forKey: kCIInputImageKey) } else if let outputImage = self.blurFilter.outputImage { self.cropFilter.setValue(outputImage, forKey: kCIInputImageKey) } else { self.cropFilter.setValue(self.currentImage, forKey: kCIInputImageKey) } outputImage = self.cropFilter.outputImage } if let image = outputImage { let openGLContext = EAGLContext(api: .openGLES2) let context = CIContext(eaglContext: openGLContext!) if let cgimg = context.createCGImage(image, from: image.extent) { let processedImage = UIImage(cgImage: cgimg) DispatchQueue.main.async { self.imageView.image = processedImage } } } else { DispatchQueue.main.async { self.imageView.image = self.selectedImage } } } } else { DispatchQueue.main.async { self.imageView.image = self.selectedImage } } } 

然后像这样应用你的滤镜(模糊滤镜)

 @IBAction func sliderValueChanged(_ sender: UISlider) { if sender.value == 0 { _ = allFilters.removeValue(forKey: kCIGaussianBlur) } else { allFilters[kCIGaussianBlur] = [kCIInputRadiusKey: sender.value] } if allFilters[kCICrop]?.first == nil { allFilters[kCICrop] = ["inputRectangle": CIVector(cgRect: self.currentImage.extent)] } applyAvailableFilters() } 

您可能应该持有对原始图像的引用,而不仅仅是将filter应用于当前在UIImageView中显示的任何图像,因为您应用filter然后将输出图像设置为UIImageView并且无法检索输入图像。 另一种选择是保留对CIFilter的引用。 为此,您应该声明一个属性:

 let noirFilter = CIFilter(name: "CIPhotoEffectNoir")! 

然后,您可以在应用filter中使用此filter并恢复为原始方法。

 @IBAction func BW_Flt_Bt_Tapped(sender: UIButton) { let beginImage = CIImage(image: imagePreview.image!) noirFilter.setValue(beginImage, forKey: kCIInputImageKey) let filteredImage = noirFilter.valueForKey(kCIOutputImageKey) as! CIImage imagePreview.image = UIImage(CIImage: filteredImage) self.orgImgBt.hidden = false self.orgImgL.hidden = false BWFlt.hidden = true BWLbl.hidden = true } @IBAction func orgImgPressed(sender: UIButton) { let inputImage = noirFilter.valueForKey(kCIInputImageKey) as! CIImage imagePreview.image = UIImage(CIImage: inputImage) orgImgBt.hidden = true orgImgL.hidden = true `enter code here` BWFlt.hidden = false `enter code here`BWLbl.hidden = false print("button was pressed") } 

或者更理想的是:

 @IBAction func orgImgPressed(sender: UIButton) { imagePreview.image = self.currentInputImage orgImgBt.hidden = true orgImgL.hidden = true `enter code here` BWFlt.hidden = false `enter code here`BWLbl.hidden = false print("button was pressed") } 

其中currentInputImage是对要应用filter的UIImage的引用。

Interesting Posts