the swiftui code below should apply the sephia.tone filter to the current photo, to do it I used the code below but the filter is not applied, can anyone explain to me where the problem is? when I click on sepia I make the call to the function that applies the CiFilter,what is this due to? because the filter is not applied correctly
Swift UI Code:
import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins
//BoxImage filter ui
struct BoxImage{
var id:Int
let title,imageurl:String
}
//BoxView filter ui
struct BoxView:View{
let box:BoxImage
var body: some View{
VStack{
Image("\(box.imageurl)").resizable().cornerRadius(12).frame(width: 80, height: 80 )
Text(box.title).font(.subheadline).fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
}
}
}
struct FilterUiView: View {
//Setup filter
@State private var currentFilter = CIFilter.sepiaTone()
let context = CIContext()
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@State var imageselected:Image=Image("Geometry")
@State var showImagePicker: Bool = false
@State private var showingSheet = false
func applyProcessing() {
guard let outputImage = currentFilter.outputImage else { return }
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let uiImage = UIImage(cgImage: cgimg)
self.imageselected = Image(uiImage: uiImage)
print("Tono seppia")
}
print("processo tono seppia")
}
var body: some View {
VStack {
Text("Filter")
.font(.system(size: 25, weight: .bold, design: .serif))
.foregroundColor(Color(#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)))
.padding(.top, 5)
Spacer()
Spacer()
Spacer()
VStack{
imageselected
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10)
.stroke(Color.green, lineWidth: 4))
.shadow(radius: 10).onTapGesture {
self.showImagePicker.toggle()
}
}.sheet(isPresented: $showImagePicker) {
ImagePicker(sourceType: .photoLibrary) { image in
self.imageselected = Image(uiImage: image)
}
}
Spacer()
Spacer()
Spacer()
VStack {
ScrollView(.horizontal){
HStack(spacing: 20) {
BoxView(box: BoxImage(id: 0, title: "Sepia", imageurl: "sepia")).onTapGesture {
applyProcessing()
}
BoxView(box: BoxImage(id: 1, title: "Model", imageurl: "Abstract"))
BoxView(box: BoxImage(id: 2,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 4,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 5,title: "Modify2i",imageurl: "Aj"))
BoxView(box: BoxImage(id: 6,title: "Modify2i",imageurl: "Aj"))
}
}
}
}.background(Color.white).navigationBarHidden(true)
}
}
You need to set input image for the filter and take care of the interoperately between Image
and UImage
import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins
//BoxImage filter ui
struct BoxImage{
var id:Int
let title,imageurl:String
}
//BoxView filter ui
struct BoxView:View{
let box:BoxImage
var body: some View{
VStack{
Image("\(box.imageurl)").resizable().cornerRadius(12).frame(width: 80, height: 80 )
Text(box.title).font(.subheadline).fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
}
}
}
struct FilterUiView: View {
//Setup filter
@State private var currentFilter = CIFilter.sepiaTone()
let context = CIContext()
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@State var imageselected:UIImage?
@State var showImagePicker: Bool = false
@State private var showingSheet = false
func applyProcessing() {
guard let cgimg = imageselected?.cgImage else {
print("imageView doesn't have an image!")
return
}
let coreImage = CIImage(cgImage: cgimg)
currentFilter.setValue(coreImage, forKey: kCIInputImageKey)
guard let outputImage = currentFilter.outputImage else { return }
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let uiImage = UIImage(cgImage: cgimg)
self.imageselected = uiImage
print("Tono seppia")
}
print("processo tono seppia")
}
var body: some View {
VStack {
Text("Filter")
.font(.system(size: 25, weight: .bold, design: .serif))
.foregroundColor(Color(#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)))
.padding(.top, 5)
Spacer()
Spacer()
Spacer()
VStack{
if imageselected == nil {
Image("Geometry")
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10)
.stroke(Color.green, lineWidth: 4))
.shadow(radius: 10).onTapGesture {
self.showImagePicker.toggle()
}
}
else {
Image(uiImage: imageselected! )
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10)
.stroke(Color.green, lineWidth: 4))
.shadow(radius: 10).onTapGesture {
self.showImagePicker.toggle()
}
}
}.sheet(isPresented: $showImagePicker) {
ImagePicker(sourceType: .photoLibrary) { image in
self.imageselected = image
}
}
Spacer()
Spacer()
Spacer()
VStack {
ScrollView(.horizontal){
HStack(spacing: 20) {
BoxView(box: BoxImage(id: 0, title: "Sepia", imageurl: "sepia")).onTapGesture {
applyProcessing()
}
BoxView(box: BoxImage(id: 1, title: "Model", imageurl: "Abstract"))
BoxView(box: BoxImage(id: 2,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 4,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 5,title: "Modify2i",imageurl: "Aj"))
BoxView(box: BoxImage(id: 6,title: "Modify2i",imageurl: "Aj"))
}
}
}
}.background(Color.white).navigationBarHidden(true)
}
}
public struct ImagePicker: UIViewControllerRepresentable {
private let sourceType: UIImagePickerController.SourceType
private let onImagePicked: (UIImage) -> Void
@Environment(\.presentationMode) private var presentationMode
public init(sourceType: UIImagePickerController.SourceType, onImagePicked: @escaping (UIImage) -> Void) {
self.sourceType = sourceType
self.onImagePicked = onImagePicked
}
public func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.sourceType = self.sourceType
picker.delegate = context.coordinator
return picker
}
public func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
public func makeCoordinator() -> Coordinator {
Coordinator(
onDismiss: { self.presentationMode.wrappedValue.dismiss() },
onImagePicked: self.onImagePicked
)
}
final public class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
private let onDismiss: () -> Void
private let onImagePicked: (UIImage) -> Void
init(onDismiss: @escaping () -> Void, onImagePicked: @escaping (UIImage) -> Void) {
self.onDismiss = onDismiss
self.onImagePicked = onImagePicked
}
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
if let image = info[.originalImage] as? UIImage {
self.onImagePicked(image)
}
self.onDismiss()
}
public func imagePickerControllerDidCancel(_: UIImagePickerController) {
self.onDismiss()
}
}
}
Before
After