swiftで画像加工してみた（コントラスト編）

１年前ほどからiOS開発をはじめたのですが、まだまだ勉強中です。
今回は勉強がてらライブラリは使わずに画像編集の基礎をやってみたいと思います。

# CIFilter
画像の加工はCIFilterを使います。
CIFilterで指定できるの以下のキーみたいです。
のぞいてみるといっぱいありますが今回使うのは

画像の指定
kCIInputImageKey
コントラスト
kCIInputContrastKey
光沢
kCIInputBrightnessKey
彩度
kCIInputSaturationKey

を使います。

```swift
@available(iOS 5.0, *)
public let kCIOutputImageKey: String
@available(iOS 5.0, *)
public let kCIInputBackgroundImageKey: String
@available(iOS 5.0, *)
public let kCIInputImageKey: String
@available(iOS 11.0, *)
public let kCIInputDepthImageKey: String
@available(iOS 11.0, *)
public let kCIInputDisparityImageKey: String
@available(iOS 12.0, *)
public let kCIInputAmountKey: String
@available(iOS 7.0, *)
public let kCIInputTimeKey: String
@available(iOS 7.0, *)
public let kCIInputTransformKey: String
@available(iOS 7.0, *)
public let kCIInputScaleKey: String
@available(iOS 7.0, *)
public let kCIInputAspectRatioKey: String
@available(iOS 7.0, *)
public let kCIInputCenterKey: String
@available(iOS 7.0, *)
public let kCIInputRadiusKey: String
@available(iOS 7.0, *)
public let kCIInputAngleKey: String
@available(iOS 9.0, *)
public let kCIInputRefractionKey: String
@available(iOS 7.0, *)
public let kCIInputWidthKey: String
@available(iOS 7.0, *)
public let kCIInputSharpnessKey: String
@available(iOS 7.0, *)
public let kCIInputIntensityKey: String
@available(iOS 7.0, *)
public let kCIInputEVKey: String
@available(iOS 7.0, *)
public let kCIInputSaturationKey: String
@available(iOS 7.0, *)
public let kCIInputColorKey: String
@available(iOS 7.0, *)
public let kCIInputBrightnessKey: String
@available(iOS 7.0, *)
public let kCIInputContrastKey: String
@available(iOS 9.0, *)
public let kCIInputBiasKey: String
@available(iOS 9.0, *)
public let kCIInputWeightsKey: String
@available(iOS 9.0, *)
public let kCIInputGradientImageKey: String
@available(iOS 7.0, *)
public let kCIInputMaskImageKey: String
@available(iOS 12.0, *)
public let kCIInputMatteImageKey: String
@available(iOS 9.0, *)
public let kCIInputShadingImageKey: String
@available(iOS 7.0, *)
public let kCIInputTargetImageKey: String
@available(iOS 7.0, *)
public let kCIInputExtentKey: String
@available(iOS 6.0, *)
public let kCIInputVersionKey: String
```

#画面デザイン
今回はシンプルにスライダーで動的に変わるようにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325497/de51a0f7-38c0-f8ce-094a-6f484e55841b.png)

#コード
スライダーのアクションを拾ってCIFilterをかけるってだけで割と簡単ですね。

UIViewController

```swift

    var contrast: Float = 1
    var brightness: Float = 0
    var saturation: Float = 1

    @IBAction func sliderAction(_ sender: Any) {
        guard let slider = sender as? UISlider, let identifier = slider.accessibilityIdentifier else { return }
        switch identifier {
        case "contrast":
            self.contrast = slider.value
        case "brightness":
            self.brightness = slider.value
        case "saturation":
            self.saturation = slider.value
        default: break
        }
        imageFilter()
    }

    private func imageFilter(){
        guard let image = baseImageView.getOriginalImage() else { return }
        let ciImage = CIImage(image:image)
        if let ciFilter  = CIFilter(name: "CIColorControls") {
            ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
            ciFilter.setValue(self.contrast, forKey: kCIInputContrastKey)
            ciFilter.setValue(self.brightness, forKey: kCIInputBrightnessKey)
            ciFilter.setValue(self.saturation, forKey: kCIInputSaturationKey)
            let ciContext:CIContext = CIContext(options: nil)
            if let outputImage = ciFilter.outputImage {
                if let cgimg: CGImage = ciContext.createCGImage(outputImage, from: outputImage.extent) {
                    baseImageView.image = UIImage(cgImage: cgimg, scale: 1.0, orientation: UIImage.Orientation.up)
                }
            }
        }
    }

```

#できたやつ
できたのはこんな感じです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325497/341d59b2-96aa-c5e3-6b4c-d9ca389f98fb.png)

↓↓↓↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325497/f707de7d-850a-65c0-073e-6edfe6b91c0d.png)

#あとがき
思ったよりも簡単にコントラスト変更できました。
次は画像に手書きでお絵かきを試してみたいと思います。

#参考
大変お世話になりました。
https://clrmemory.com/programming/swift/cocoa-contrast-brightness-filter/