Skip to content

Instantly share code, notes, and snippets.

@DonMag
Created March 14, 2021 14:34
Show Gist options
  • Save DonMag/fb26a3b5646cbc6746337adea2dd2d30 to your computer and use it in GitHub Desktop.
Save DonMag/fb26a3b5646cbc6746337adea2dd2d30 to your computer and use it in GitHub Desktop.
class TestFilterViewController: UIViewController {
let sepiaSharpenBlurImageView: UIImageView = {
let v = UIImageView()
v.contentMode = .scaleAspectFit
return v
}()
let sepiaBlurSharpenImageView: UIImageView = {
let v = UIImageView()
v.contentMode = .scaleAspectFit
return v
}()
let sepiaSharpenBlurLabel = UILabel()
let sepiaBlurSharpenLabel = UILabel()
var origImage: UIImage!
override func viewDidLoad() {
super.viewDidLoad()
guard let img = UIImage(named: "sampleImage") else {
fatalError("Could not load image!!!")
}
origImage = img
let stack = UIStackView()
stack.axis = .vertical
stack.distribution = .fill
stack.spacing = 8
stack.translatesAutoresizingMaskIntoConstraints = false
stack.addArrangedSubview(sepiaSharpenBlurLabel)
stack.addArrangedSubview(sepiaSharpenBlurImageView)
stack.addArrangedSubview(sepiaBlurSharpenLabel)
stack.addArrangedSubview(sepiaBlurSharpenImageView)
let promptLabel = UILabel()
promptLabel.textAlignment = .center
promptLabel.text = "Tap Anywhere"
stack.addArrangedSubview(promptLabel)
view.addSubview(stack)
let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
stack.centerXAnchor.constraint(equalTo: g.centerXAnchor),
stack.centerYAnchor.constraint(equalTo: g.centerYAnchor),
stack.heightAnchor.constraint(equalTo: g.heightAnchor, multiplier: 0.9),
sepiaSharpenBlurImageView.widthAnchor.constraint(equalTo: sepiaSharpenBlurImageView.heightAnchor),
sepiaBlurSharpenImageView.widthAnchor.constraint(equalTo: sepiaBlurSharpenImageView.heightAnchor),
])
[sepiaSharpenBlurLabel, sepiaBlurSharpenLabel, promptLabel].forEach {
$0.setContentCompressionResistancePriority(.required, for: .vertical)
}
sepiaSharpenBlurImageView.image = origImage
sepiaBlurSharpenImageView.image = origImage
updateLabels()
}
var step: Int = 0
func updateLabels() -> Void {
switch step {
case 0:
sepiaSharpenBlurLabel.text = "Orig"
sepiaBlurSharpenLabel.text = "Orig"
case 1:
if let t = sepiaSharpenBlurLabel.text {
sepiaSharpenBlurLabel.text = t + "; Sepia"
}
if let t = sepiaBlurSharpenLabel.text {
sepiaBlurSharpenLabel.text = t + "; Sepia"
}
case 2:
if let t = sepiaSharpenBlurLabel.text {
sepiaSharpenBlurLabel.text = t + "; Sharpen"
}
if let t = sepiaBlurSharpenLabel.text {
sepiaBlurSharpenLabel.text = t + "; Blur"
}
case 3:
if let t = sepiaSharpenBlurLabel.text {
sepiaSharpenBlurLabel.text = t + "; Blur"
}
if let t = sepiaBlurSharpenLabel.text {
sepiaBlurSharpenLabel.text = t + "; Sharpen"
}
default:
()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let imgA = sepiaBlurSharpenImageView.image,
let imgB = sepiaSharpenBlurImageView.image
else {
fatalError("Image View has no image!!!!")
}
switch step {
case 0:
let newImageA = imgA.addSepiaFilter()
sepiaBlurSharpenImageView.image = newImageA
let newImageB = imgB.addSepiaFilter()
sepiaSharpenBlurImageView.image = newImageB
case 1:
let newImageA = imgA.addBlur(radius: 20.0)
sepiaBlurSharpenImageView.image = newImageA
let newImageB = imgB.adjustSharpness(sharpness: 20.0)
sepiaSharpenBlurImageView.image = newImageB
case 2:
let newImageA = imgA.adjustSharpness(sharpness: 20.0)
sepiaBlurSharpenImageView.image = newImageA
let newImageB = imgB.addBlur(radius: 20.0)
sepiaSharpenBlurImageView.image = newImageB
default:
sepiaSharpenBlurImageView.image = origImage
sepiaBlurSharpenImageView.image = origImage
step = -1
}
step += 1
updateLabels()
}
}
extension UIImage {
static let ciContext = CIContext()
// what is FilterType ??
// func addFilter(filter: FilterType) -> UIImage {
// let filter = CIFilter(name: filter.rawValue)
//
// let ciInput = CIImage(image: self)
// filter?.setValue(ciInput,
// forKey: "inputImage")
//
// if let ciOutput = filter?.outputImage {
// if let cgImage = UIImage.ciContext.createCGImage(ciOutput,
// from: (ciOutput.extent)){
// return UIImage(cgImage: cgImage)
// }
// }
//
// return self
// }
func addSepiaFilter() -> UIImage {
let filter = CIFilter(name: "CISepiaTone")
let ciInput = CIImage(image: self)
filter?.setValue(ciInput,
forKey: "inputImage")
if let ciOutput = filter?.outputImage {
if let cgImage = UIImage.ciContext.createCGImage(ciOutput,
from: (ciOutput.extent)){
return UIImage(cgImage: cgImage)
}
}
return self
}
func addBlur(radius value:Float) -> UIImage {
let filter = CIFilter(name: "CIBoxBlur")
let ciInput = CIImage(image: self)
filter?.setValue(ciInput,
forKey: "inputImage")
filter?.setValue(value,
forKey: "inputRadius")
if let ciOutput = filter?.outputImage, let ciInput = ciInput {
if let cgImage = UIImage.ciContext.createCGImage(ciOutput,
from: (ciInput.extent)){
return UIImage(cgImage: cgImage)
}
}
return self
}
func adjustSharpness(sharpness value:Float) -> UIImage {
let filter = CIFilter(name: "CISharpenLuminance")
let ciInput = CIImage(image: self)
filter?.setValue(ciInput,
forKey: "inputImage")
filter?.setValue(value,
forKey: "inputSharpness")
if let ciOutput = filter?.outputImage, let ciInput = ciInput {
if let cgImage = UIImage.ciContext.createCGImage(ciOutput,
from: (ciInput.extent)){
return UIImage(cgImage: cgImage)
}
}
return self
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment