Ios Swift无法从UIImage中删除CIFIlter
现在已经在swift上工作了一段时间,在处理这个核心图像框架时遇到了困难。我能够成功地在图像上创建CIFilter,但是我不确定如何删除它。将图像放置在与snapchat相机屏幕相似的UIView上,然后有一个imageview,它是预览图像的UIView的子视图。顺便说一句,使用最新版本的Xcode和iOS 以下是应用黑白过滤器时的代码:Ios Swift无法从UIImage中删除CIFIlter,ios,swift,uiview,cifilter,ciimage,Ios,Swift,Uiview,Cifilter,Ciimage,现在已经在swift上工作了一段时间,在处理这个核心图像框架时遇到了困难。我能够成功地在图像上创建CIFilter,但是我不确定如何删除它。将图像放置在与snapchat相机屏幕相似的UIView上,然后有一个imageview,它是预览图像的UIView的子视图。顺便说一句,使用最新版本的Xcode和iOS 以下是应用黑白过滤器时的代码: @IBAction func BW_Flt_Bt_Tapped(sender: UIButton) { let beginImage = CIIma
@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")
}
如果有人有任何建议,我将非常感激,谢谢 您可能应该保留对原始图像的引用,而不仅仅是将过滤器应用于当前在
UIImageView
中显示的任何图像,因为应用过滤器后,您将输出图像设置为UIImageView
,并且无法检索输入图像。另一个选项是保留对CIFilter
的引用。为此,您应该声明一个属性:
let noirFilter = CIFilter(name: "CIPhotoEffectNoir")!
然后,您可以在应用过滤器中使用此过滤器,并还原为原始方法
@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
是对要应用筛选器的UIImage
的引用。可以通过在变量中保留以前的值或如果有多个筛选器,则将该值保留在字典中来实现。应用新过滤器或更改现有过滤器的值时,只需将该值替换为新值并应用原始图像上的所有值即可
比如说,
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
}
}
}
然后像这样应用过滤器(模糊过滤器)
什么是
self.selectedImage
?这确实给了我想要的图像,但是它旋转且比原始图像小,有没有关于如何纠正的建议?您是否尝试使用UIImage(CIImage:,scale:,orientation:)
而不是UIImage(CIImage:)
?
@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()
}