UIImage를 위한 사용자 정의 리사이징 필터 만들기: 필터를 사용하여 이미지 리사이징 후의 품질을 개선하는 방법.

작성일 :

UIImage를 위한 사용자 정의 리사이징 필터 만들기: 필터를 사용하여 이미지 리사이징 후의 품질을 개선하는 방법

이미지를 리사이즈할 때 품질이 저하되는 문제가 종종 발생합니다. 특히 UIImage를 처리할 때 이러한 문제가 두드러지는데, 이는 표준 라이브러리의 제한에 기인할 수 있습니다. 이 글에서는 Swift를 사용하여 이미지 리사이징 후에도 높은 품질을 유지할 수 있는 사용자 정의 리사이징 필터를 만드는 방법에 대해 다룹니다.

리사이징의 기본 개념

이미지 리사이징은 원본 이미지의 크기를 변경하여 메모리 사용량을 줄이거나 특정 해상도에 맞추는 중요한 과정입니다. 그러나 리사이징 후에도 원본 이미지의 품질을 최대한 유지하는 것이 매우 중요합니다. 기본적으로 제공되는 리사이징 알고리즘으로는 CoreGraphics 프레임워크의 draw(in:) 메서드를 사용할 수 있습니다.

기본 리사이징 방법

아래 코드는 기본적인 이미지 리사이징을 수행하는 예제입니다.

swift
import UIKit

extension UIImage {
    func resized(to size: CGSize) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        self.draw(in: CGRect(origin: .zero, size: size))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
}

위의 코드는 UIGraphicsBeginImageContextWithOptions를 사용하여 새로운 사이즈의 이미지를 생성합니다. 그러나 이 방식은 고해상도의 이미지일수록 품질이 저하될 가능성이 큽니다.

사용자 정의 리사이징 필터의 필요성

기본 방법으로 리사이징할 때 품질 저하 문제가 발생할 수 있으므로, 사용자 정의 리사이징 필터를 사용하여 품질을 개선할 필요가 있습니다. 이를 위해 Core Image 프레임워크를 사용할 수 있습니다.

Core Image 프레임워크의 활용

Core Image는 이미지 필터링과 처리에 매우 강력한 프레임워크입니다. Core ImageCIFilter를 사용하면 이미지의 리사이징 품질을 개선할 수 있습니다.

CIFilter를 사용한 리사이징 예제

다음은 CILanczosScaleTransform 필터를 사용하여 이미지를 리사이징하는 예제입니다.

swift
import UIKit
import CoreImage

extension UIImage {
    func resizedWithCIFilter(to size: CGSize) -> UIImage? {
        guard let cgImage = self.cgImage else { return nil }
        let ciImage = CIImage(cgImage: cgImage)
        let scale = size.width / self.size.width
        let parameters: [String: Any] = [
            kCIInputImageKey: ciImage,
            kCIInputScaleKey: scale,
            kCIInputAspectRatioKey: size.width / size.height
        ]
        let filter = CIFilter(name: "CILanczosScaleTransform", parameters: parameters)
        guard let outputImage = filter?.outputImage else { return nil }
        let context = CIContext(options: nil)
        guard let outputCGImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }
        return UIImage(cgImage: outputCGImage)
    }
}

위의 코드는 CILanczosScaleTransform 필터를 사용하여 이미지를 리사이즈합니다. 이를 통해 기본 리사이징 방법보다 높은 품질의 이미지를 얻을 수 있습니다.

성능 최적화

이미지 리사이징 작업은 매우 많은 계산을 요구할 수 있습니다. 따라서 성능 최적화는 매우 중요합니다. 다음의 팁을 참고하세요:

  • 배치 작업 사용: 여러 이미지를 한꺼번에 처리할 때 배치 작업을 사용하는 것이 효율적입니다.
  • 백그라운드 스레드 사용: 메인 스레드에서 이미지 처리를 피하기 위해 백그라운드 스레드에서 리사이징 작업을 수행하십시오.
  • 캐싱: 이미 처리된 이미지를 캐싱하여 불필요한 중복 처리를 피함으로써 성능을 크게 향상시킬 수 있습니다.

예제: 배치 작업

아래 코드는 여러 개의 이미지를 배치로 리사이징하는 방법을 보여줍니다.

swift
func resizeImages(_ images: [UIImage], to size: CGSize) -> [UIImage] {
    var resizedImages: [UIImage] = []
    let dispatchGroup = DispatchGroup()

    images.forEach { image in
        dispatchGroup.enter()
        DispatchQueue.global(qos: .userInitiated).async {
            if let resizedImage = image.resizedWithCIFilter(to: size) {
                DispatchQueue.main.async {
                    resizedImages.append(resizedImage)
                    dispatchGroup.leave()
                }
            } else {
                dispatchGroup.leave()
            }
        }
    }

    dispatchGroup.wait()
    return resizedImages
}

위의 코드는 디스패치 그룹과 글로벌 큐를 사용하여 다수의 이미지를 동시에 리사이즈합니다. 이를 통해 성능을 최적화할 수 있습니다.

결론

UIImage의 리사이징 품질을 개선하는 것은 애플리케이션의 전반적인 사용자 경험을 향상시킬 수 있습니다. 사용자 정의 리사이징 필터, 특히 Core ImageCIFilter를 활용하여 높은 품질의 이미지를 유지할 수 있습니다. 이번 글에서는 CILanczosScaleTransform 필터를 사용한 리사이징 예제와 성능 최적화 방법에 대해 다뤘습니다. 이를 통해 여러분의 프로젝트에서 이미지 리사이징 품질을 크게 개선할 수 있을 것입니다.