🧬

[Swift]CIFilter 超速サンプル

2022/11/01に公開

CIFilterを使うと、画像にフィルターをかけられる。

サンプルコード(単独)

フィルター種類がたくさんある中から、サンプルで彩度と色反転のサンプルコード。

public extension UIImage {
    
    // 彩度設定
    func saturation(value: CGFloat) -> UIImage? {
        guard let ciImage = CIImage(image: self) else {
            return nil
        }
        guard let ciFilter = CIFilter(name: "CIColorControls") else {
            return nil
        }
        ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
        ciFilter.setValue(value, forKey: "inputSaturation")

        guard let ciFilterOutputImage = ciFilter.outputImage else {
            return nil
        }
        return UIImage(ciImage: ciFilterOutputImage, scale: 1.0, orientation: .up)
    }
    
    // 色反転
    func invertColor() -> UIImage? {
        guard let ciImage = CIImage(image: self) else {
            return nil
        }
        guard let ciFilter = CIFilter(name: "CIColorInvert") else {
            return nil
        }
        ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
        guard let ciFilterOutputImage = ciFilter.outputImage else {
            return nil
        }
        return UIImage(ciImage: ciFilterOutputImage, scale: 1.0, orientation: .up)
    }

サンプルコード(複合)

複数フィルターを合わせることもできる。
色反転+彩度設定のサンプル。

    // 色反転+彩度設定
    func invertAndSaturation(value: CGFloat) -> UIImage? {
        guard let ciImage = CIImage(image: self) else {
            return nil
        }
        guard let ciInvertFilter = CIFilter(name: "CIColorInvert") else {
            return nil
        }
        ciInvertFilter.setValue(ciImage, forKey: kCIInputImageKey)
        guard let ciInvertFilterOutputImage = ciInvertFilter.outputImage else {
            return nil
        }

        guard let ciSaturationFilter = CIFilter(name: "CIColorControls") else {
            return nil
        }
        ciSaturationFilter.setValue(ciInvertFilterOutputImage, forKey: kCIInputImageKey)
        ciSaturationFilter.setValue(value, forKey: "inputSaturation")
        guard let ciSaturationFilterOutputImage = ciSaturationFilter.outputImage else {
            return nil
        }
        return UIImage(ciImage: ciSaturationFilterOutputImage, scale: 1.0, orientation: .up)
    }
}

公式リファレンス

公式のリファレンス。
指定パラメータや見た目のサンプルも載っていて分かりやすい。

Core Image Filter Reference
https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

Discussion