[swift] Swift에서 카메라로 색조 및 포인트츠 효과 적용하기

Swift를 사용하여 카메라 앱을 만들고 싶다면, 색조나 포인트츠(Poindexter) 효과를 적용하는 것이 흥미로운 요소가 될 것입니다. 이 기능을 구현하는 방법에 대해 알아보겠습니다.

카메라 앱 만들기

먼저, AVFoundation 프레임워크를 사용하여 카메라 앱을 만들어 보겠습니다. 이를 위해 다음과 같은 단계를 따릅니다.

1. 프로젝트에 AVFoundation 추가하기

Xcode에서 프로젝트를 열고, 프로젝트 탐색기에서 “General” 탭으로 이동합니다. 그런 다음, “Linked Frameworks and Libraries” 섹션에 있는 “+” 버튼을 클릭하여 AVFoundation 프레임워크를 추가합니다.

2. 카메라 미리보기 추가하기

카메라 미리보기를 표시하기 위해 AVCaptureVideoPreviewLayer를 사용합니다. 이를 보여주기 위한 UIView를 생성하고, AVCaptureVideoPreviewLayer를 이 UIView에 추가합니다.

import AVFoundation
import UIKit

class CameraViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let captureSession = AVCaptureSession()

        // 카메라를 설정하고, input을 captureSession에 추가합니다.
        guard let device = AVCaptureDevice.default(for: .video),
              let input = try? AVCaptureDeviceInput(device: device) else {
            return
        }

        captureSession.addInput(input)

        let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        previewLayer.frame = view.layer.bounds
        view.layer.addSublayer(previewLayer)

        captureSession.startRunning()
    }
}

색조 효과 적용하기

이제, 미리보기에 색조 효과를 적용하는 방법을 살펴보겠습니다. 카메라에서 가져온 비디오를 처리하기 위해 AVCaptureVideoDataOutputSampleBufferDelegate 프로토콜을 구현합니다.

import AVFoundation
import UIKit

class CameraViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    var videoDataOutput = AVCaptureVideoDataOutput()

    override func viewDidLoad() {
        super.viewDidLoad()

        // ... (카메라 미리보기 설정)

        videoDataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "sample buffer delegate", qos: .userInteractive))

        if captureSession.canAddOutput(videoDataOutput) {
            captureSession.addOutput(videoDataOutput)
        }
    }

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        // 비디오 프레임을 처리하고, 색조 효과를 적용합니다.
        // 색조 효과를 적용한 비디오를 얻은 후, 미리보기에 표시합니다.
    }
}

포인트츠 효과 적용하기

포인트츠(Poindexter) 효과는 이미지 및 비디오에 적용되는 비주얼 효과로, 화면을 흑백 또는 세피아 톤으로 변환하는 것입니다. 이를 위해 이미지 및 비디오 처리 라이브러리 등을 사용하여 효과를 쉽게 적용할 수 있습니다.

func applyPointillizeEffect(to image: CIImage) -> CIImage? {
    let filter = CIFilter(name: "CIPixellate")
    filter?.setValue(image, forKey: kCIInputImageKey)
    filter?.setValue(20, forKey: kCIInputScaleKey)

    if let outputImage = filter?.outputImage {
        return outputImage
    } else {
        return nil
    }
}

이제, 우리는 포인트츠 효과를 적용할 수 있습니다. 올바른 CIImage를 가져와서 applyPointillizeEffect 함수에 전달하여 효과를 적용하고, 색조 효과와 마찬가지로 미리보기에 표시할 수 있습니다.

이제, Swift를 사용하여 카메라 앱에 색조 및 포인트츠 효과를 쉽게 적용할 수 있습니다. 색조 및 포인트츠 효과 외에도 다양한 이미지 및 비디오 효과를 적용하여 더욱 흥미로운 카메라 앱을 만들 수 있습니다.

참고 문헌:

이 글은 Swift에서 카메라 앱에 색조 및 포인트츠 효과를 적용하는 방법에 대해 알아보았습니다.