İçeriğe geç

CIColorKernel kullanarak custom filtre oluşturmak

Merhabalar bir önceki yazımda bahsettiğim CIFilter ile filtre eklemeyi bir sonraki adıma geçirip GLSL kod yapısı ile kendi filtrelerimizi nasıl yazarız bunu göstereceğim.

Resimler bildiğimiz gibi pixellerden oluşur ve bu pixeller üzerinde yapacağımız değişikler resimin görüntüsünü doğrudan etkiler. Her bir pixel bir RGB değerine karşılık gelir. Bu değer ile doğru bir şekilde resim üzerinde oynama işlemleri yaparsak farklı renkte filtreler yaratmamız mümkün olur. Tabiki burada bahsedeceğim yöntem ilede belirli custom yapıda filtreler oluşturabiliriz. Daha detaylı ve kaliteli filtreler için görüntü işleme ve makine öğrenme alanlarını birleştirerek resimdeki nesnelere ve bu nesnelerin konumlarına görede değişimler yaratabiliriz.

CIColorKarnel sınıfı bize GLSL kod yapısını kullanarak kendi filtrelerimizi oluşturma imkanı vermekte. Bu yapıda OpenGL Shader Programing olarak bilinmekte. İçerisinde string olarak yazdığımız kod yapısını kendisi derleyerek filtreyi oluşturmakta.

Aşağıdaki örneği inceleyebilirsiniz.

import UIKit


class mainVC: UIViewController {
    
    var imgView:UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        imgView = UIImageView()
        imgView.image = #imageLiteral(resourceName: "famiy")
        imgView.isUserInteractionEnabled = true
        imgView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
        view.addSubview(imgView)
        
        self.imgView.image = #imageLiteral(resourceName: "famiy")
        self.imgView.image = self.setCustomFilter(image: self.imgView.image!)
    }
    
    func setCustomFilter(image:UIImage) -> UIImage {
        
        let sourceImage = CIImage(image: image)
        
        let myFilter = CustomFilter()
        myFilter.inputImage = sourceImage
        
        let context = CIContext(options: nil)
        
        let outputCGImage = context.createCGImage(myFilter.outputImage!, from: myFilter.outputImage!.extent)
        
        let filteredImage = UIImage(cgImage: outputCGImage!)
        
        return filteredImage
    }
    
    override var prefersStatusBarHidden: Bool {
        return true
    }
}//

@objcMembers class CustomFilter: CIFilter {
    
    var inputImage: CIImage?
    
    override public var outputImage: CIImage! {
        get {
            if let inputImage = self.inputImage {
                let args = [inputImage as AnyObject]
                return customKernel().apply(withExtent: inputImage.extent, arguments: args)
            } else {
                return nil
            }
        }
    }
    
    func customKernel() -> CIColorKernel {
        
        let kernelString =
            "kernel vec4 cFilter( __sample s) { \n" +
                "  vec4 newPixel = s.rgba;" +
                "  newPixel[0] = 1.0;" +
                "  newPixel[1] = newPixel[1] / 2.0;" +
                "  newPixel[2] = newPixel[1];" +
                "  return newPixel;\n" +
        "}"
        
        return CIColorKernel(string: kernelString)!
    }
}

Burada kernelString içerisindeki glsl program yapısını biraz öğrenip buna göre filtreler yazmak gerekli. Onun dışındaki olaylar CIFilter ile output almak.

Kategori:iOS

Bu yazı yorumlara kapalı.

Copyright © 2022 Kenan Atmaca