[swift] Swift에서 카메라로 사진 필터 적용하기

Swift를 사용하여 iOS 애플리케이션을 개발하는 경우, 카메라로 찍은 사진에 필터를 적용하는 기능을 구현하고 싶을 수 있습니다. 이 기능을 구현하기 위해서는 AVFoundationCore Image 프레임워크를 사용하여 카메라로부터 입력을 받고 필터를 적용하는 방법을 알아야 합니다. 이번 블로그 포스트에서는 Swift를 사용하여 카메라로 찍은 사진에 필터를 적용하는 방법에 대해 알아보겠습니다.

카메라로부터 입력 받기

먼저, iOS 디바이스의 카메라로부터 입력을 받기 위해 AVFoundation 프레임워크를 사용합니다. 카메라에서 입력을 받기 위해 AVCaptureSession, AVCaptureDevice, AVCaptureInput, AVCaptureOutput 등의 클래스를 사용합니다. 아래는 카메라에서 입력을 받는 코드의 예시입니다.

import AVFoundation
import UIKit

class CameraViewController: UIViewController, AVCapturePhotoCaptureDelegate {
    let session = AVCaptureSession()
    var previewLayer: AVCaptureVideoPreviewLayer!

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let device = AVCaptureDevice.default(for: .video) else { return }
        guard let input = try? AVCaptureDeviceInput(device: device) else { return }

        session.addInput(input)
        session.startRunning()

        previewLayer = AVCaptureVideoPreviewLayer(session: session)
        view.layer.addSublayer(previewLayer)
    }
}

위의 코드는 카메라로부터 입력을 받아 미리보기 레이어에 표시하는 간단한 예시입니다.

필터 적용하기

이제 받은 카메라 입력에 필터를 적용할 차례입니다. Core Image 프레임워크를 사용하여 이미지에 다양한 필터를 적용할 수 있습니다. 아래는 이미지에 필터를 적용하는 예시 코드입니다.

import CoreImage
import UIKit

func applyFilter(to image: UIImage) -> UIImage? {
    guard let filter = CIFilter(name: "CIPhotoEffectMono") else { return nil }
    filter.setValue(CIImage(image: image), forKey: kCIInputImageKey)

    guard let outputImage = filter.outputImage else { return nil }
    let context = CIContext(options: nil)

    if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
        return UIImage(cgImage: cgImage)
    } else {
        return nil
    }
}

위의 코드는 CIPhotoEffectMono 필터를 사용하여 흑백으로 변환하는 예시입니다.

카메라 입력에 필터 적용하기

마지막으로, 받은 카메라 입력에 필터를 적용하고 보여주는 부분을 코드로 작성할 수 있습니다.

func captureOutput(_ output: AVCaptureOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    if let imageData = photo.fileDataRepresentation(),
       let image = UIImage(data: imageData),
       let filteredImage = applyFilter(to: image) {
        // 필터가 적용된 이미지를 어딘가에 보여주거나 저장할 수 있음
    }
}

위의 코드는 카메라로부터 사진을 찍은 후에 필터를 적용하여 보여주는 예시입니다.

위의 예시 코드들은 간단한 형태이며 실제 애플리케이션에 적용하기 위해서는 보다 더 다양한 필터들과 사용자 인터페이스를 추가하여 완성도 높은 카메라 애플리케이션을 개발할 수 있습니다.

이상으로 Swift를 사용하여 카메라로 사진에 필터를 적용하는 방법에 대해 알아보았습니다. 추가적으로 사용자 정의 필터나 다양한 UI 요소를 추가하여 더 다양한 기능을 구현할 수 있습니다. Happy coding!