1
2

【Swift】CIFilterで画像にノイズを合成する

Posted at

はじめに

最近、画像加工系のアプリを作っているのでCIFilterを使うことが多いです。
CIFilterを使ったアウトプットをしていこうと思います。
今回は画像にノイズを追加するコードをやってみます。

元画像

icon.png

生成されるノイズ画像

outputImage.png

実装

import SwiftUI

struct ContentView: View {
    @State private var displayImage: UIImage?

    private let image = UIImage(named: "sample")!

    var body: some View {
        VStack {
            if let displayImage {
                Image(uiImage: displayImage)
                    .resizable()
                    .scaledToFit()
                    .frame(width: 300)
            } else {
                Image(uiImage: image)
                    .resizable()
                    .scaledToFit()
                    .frame(width: 300)
            }
            
            Button {
                applyNoise()
            } label: {
                Text("ノイズ追加")
            }
        }
    }

    func applyNoise() {
        let context = CIContext()
        let inputImage = CIImage(image: image)!
        // ノイズを作成
        guard let noiseFilter = CIFilter(name: "CIRandomGenerator") else { return }
        guard let noiseOutputImage = noiseFilter.outputImage else { return }
        // ブレンド
        guard let blendFilter = CIFilter(name: "CIMultiplyBlendMode", parameters: [
            kCIInputImageKey: noiseOutputImage,
            kCIInputBackgroundImageKey: inputImage
        ]) else { return }
        // 出力
        guard let blendOutputImage = blendFilter.outputImage else { return }
        guard let cgImage = context.createCGImage(blendOutputImage, from: inputImage.extent) else { return }
        self.displayImage = UIImage(cgImage: cgImage)
    }
}

結果

simulator_screenshot_229663CF-B2CC-45F1-AC19-8484A2CD9E64.png

おわり

CIFilter深いですね

1
2
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
1
2