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
画面デザイン
今回はシンプルにスライダーで動的に変わるようにしてみました。

コード
スライダーのアクションを拾って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)
}
}
}
}
できたやつ
できたのはこんな感じです。
↓↓↓↓↓
あとがき
思ったよりも簡単にコントラスト変更できました。
次は画像に手書きでお絵かきを試してみたいと思います。
参考
大変お世話になりました。
https://clrmemory.com/programming/swift/cocoa-contrast-brightness-filter/

