Skip to content

Instantly share code, notes, and snippets.

@jerrypm
Created February 24, 2023 13:43
Show Gist options
  • Save jerrypm/52de6cead3be8fce91e8efbb654f49c2 to your computer and use it in GitHub Desktop.
Save jerrypm/52de6cead3be8fce91e8efbb654f49c2 to your computer and use it in GitHub Desktop.
// Created by Jeri Purnama on 24/02/23.
/*
Use this Pod to Filter Image
https://cocoapods.org/pods/MetalPetal
*/
import SwiftUI
import MetalPetal
struct ContentViewOne: View {
@State var inputImage = UIImage(named: "subWall1")!
var body: some View {
VStack {
Image(uiImage: inputImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 300, height: 300)
Button("Apply Filter") {
inputImage = applyFilter(inputImage)
}
}
}
func applyFilter(_ image: UIImage) -> UIImage {
let context = try! MTIContext(device: MTLCreateSystemDefaultDevice()!)
// Load the input image into a MetalPetal image object
let input = MTIImage(__cgImage: image.cgImage!, options: [.SRGB: false], isOpaque: true)
// Create a MetalPetal filter
let filter = MTICLAHEFilter() // name filter
filter.inputImage = input
// Apply the filter
let output = filter.outputImage!
// Render the output image to a CGImage
let cgImage = try! context.makeCGImage(from: output)
// Convert the CGImage to a UIImage
let outputImage = UIImage(cgImage: cgImage)
return outputImage
}
}
struct ContentViewTwo: View {
@State var inputImage = UIImage(named: "subWall1")!
@State var currentFilter: MTIUnaryFilter = MTIColorInvertFilter()
@State var filterStrength: Double = 1.0
var body: some View {
VStack {
Image(uiImage: inputImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 300, height: 300)
Slider(value: $filterStrength, in: 0.0...1.0, step: 0.01, onEditingChanged: { _ in
applyFilter()
})
HStack {
Button("Invert") {
currentFilter = MTIColorInvertFilter()
applyFilter()
}
Button("Grayscale") {
currentFilter = MTIDotScreenFilter()
applyFilter()
}
Button("Sepia") {
currentFilter = MTICLAHEFilter()
applyFilter()
}
}
}
}
func applyFilter() {
let context = try! MTIContext(device: MTLCreateSystemDefaultDevice()!)
// Load the input image into a MetalPetal image object
let input = MTIImage(__cgImage: inputImage.cgImage!, options: [.SRGB: false], isOpaque: true)
// Create a MetalPetal filter
let filter = currentFilter
filter.inputImage = input
// filter.inputIntensity = filterStrength
// Apply the filter
let output = filter.outputImage!
// Render the output image to a CGImage
let cgImage = try! context.makeCGImage(from: output)
// Convert the CGImage to a UIImage
let outputImage = UIImage(cgImage: cgImage)
inputImage = outputImage
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentViewTwo()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment