3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-09-03

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

CIFilter

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

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

を使います。

@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

コード

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

UIViewController


    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

↓↓↓↓↓

image.png

あとがき

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

参考

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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?