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

이번에는 Swift를 사용하여 iOS 애플리케이션에 카메라 필터를 적용하는 방법에 대해 알아보겠습니다.

카메라 액세스 권한 요청

먼저, 카메라 앱을 사용하기 위해 필요한 권한을 요청해야 합니다. Info.plist 파일에 NSCameraUsageDescription 키를 추가하여 카메라 액세스에 대한 설명을 작성해야 합니다. 사용자에게 카메라 액세스 권한을 요청할 때 이 설명이 표시됩니다.

<key>NSCameraUsageDescription</key>
<string>카메라 액세스 권한이 필요합니다.</string>

카메라 뷰 구성

카메라를 보여주는 뷰를 구성합니다. UIKit에서 제공하는 AVCaptureVideoPreviewLayer를 사용하여 카메라 뷰를 만들 수 있습니다.

import AVFoundation
import UIKit

class CameraViewController: UIViewController {
    private let captureSession = AVCaptureSession()

    override func viewDidLoad() {
        super.viewDidLoad()

        let cameraView = UIView(frame: view.bounds)
        view.addSubview(cameraView)

        if let videoDevice = AVCaptureDevice.default(for: AVMediaType.video),
           let videoInput = try? AVCaptureDeviceInput(device: videoDevice) {
            captureSession.addInput(videoInput)
            
            let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            previewLayer.frame = cameraView.bounds
            cameraView.layer.addSublayer(previewLayer)
            
            captureSession.startRunning()
        }
    }
}

필터 적용

카메라가 실시간으로 보여지는 뷰에 필터를 적용하려면 Core Image 프레임워크를 사용할 수 있습니다. 예를 들어, 흑백 필터를 적용하는 방법은 다음과 같습니다.

import AVFoundation
import UIKit

class CameraViewController: UIViewController {
    // ...

    private let context = CIContext()

    override func viewDidLoad() {
        // ...

        let filter = CIFilter(name: "CIPhotoEffectMono")

        let videoOutput = AVCaptureVideoDataOutput()
        videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        if captureSession.canAddOutput(videoOutput) {
            captureSession.addOutput(videoOutput)
        }
    }
}

extension CameraViewController: AVCaptureVideoDataOutputSampleBufferDelegate {
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        if let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
            let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
            filter.setValue(ciImage, forKey: kCIInputImageKey)

            if let outputImage = filter.outputImage,
               let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
                // 실시간으로 보여지는 뷰에 cgImage를 렌더링하는 코드
            }
        }
    }
}

이렇게 하면 카메라로부터 들어오는 영상에 실시간으로 흑백 필터가 적용되어 화면에 보여지게 됩니다.

마치며

Swift를 사용하여 카메라 필터를 적용하는 방법에 대해 알아보았습니다. 카메라 액세스 권한을 요청하고, 카메라 뷰를 구성하며, Core Image 프레임워크를 사용하여 필터를 적용하는 방법을 살펴보았습니다. iOS 애플리케이션을 개발하는데 있어 다양한 카메라 효과를 적용하여 사용자에게 다채로운 경험을 제공할 수 있습니다.

참고문헌: