はじめに
最近、画像加工系のアプリを作っているのでCIFilterを使うことが多いです。
CIFilterを使ったアウトプットをしていこうと思います。
今回は画像にノイズを追加するコードをやってみます。
元画像
生成されるノイズ画像
実装
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)
}
}
結果
おわり
CIFilter深いですね