[swift] Swift Core Graphics로 픽셀 단계별로 조작하기

Swift의 Core Graphics 프레임워크를 사용하면 이미지에 픽셀 수준에서 직접적인 조작을 할 수 있습니다. 이 기술은 이미지 프로세싱, 커스텀 이미지 필터링, 캔버스 그리기 어플리케이션 등 다양한 그래픽 작업에 유용하게 활용될 수 있습니다.

이번 튜토리얼에서는 Core Graphics를 사용하여 이미지의 각 픽셀을 확인하고 조작하는 방법에 대해 살펴보겠습니다.

이미지로부터 픽셀 데이터 가져오기

Core Graphics를 사용하여 이미지로부터 픽셀 데이터를 가져오기 위해서는 다음과 같은 단계를 따릅니다.

  1. UIImage 객체를 생성합니다.
  2. UIImage의 cgImage 프로퍼티를 사용하여 CGImage 객체를 가져옵니다.
  3. CGImage 속성을 이용하여 이미지 데이터에 접근합니다.
import UIKit

// 이미지 파일의 경로
let imagePath = "image.png"

// UIImage 객체 생성
let image = UIImage(named: imagePath)

// CGImage 객체 가져오기
guard let cgImage = image.cgImage else {
    // CGImage가 가져와지지 않을 경우의 처리
    return
}

// 이미지 데이터에 접근
let width = cgImage.width
let height = cgImage.height
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bytesPerPixel = 4
let bytesPerRow = bytesPerPixel * width
let bitsPerComponent = 8
let bitmapInfo = RGBA32.bitmapInfo
guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else {
    // 컨텍스트가 생성되지 않을 경우의 처리
    return
}
context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))

픽셀 데이터 조작하기

이제 픽셀 데이터에 직접적으로 접근하여 이미지를 수정할 수 있습니다. 예를 들어, 이미지의 모든 픽셀을 반전시키는 등의 작업을 수행할 수 있습니다.

// 픽셀 데이터에 접근하여 이미지 수정하기
guard let pixelBuffer = context.data else {
    // 픽셀 데이터에 접근할 수 없을 경우의 처리
    return
}

let buffer = pixelBuffer.bindMemory(to: RGBA32.self, capacity: width * height)
for y in 0 ..< height {
    for x in 0 ..< width {
        let offset = y * width + x
        let color = buffer[offset]
        let invertedColor = RGBA32(red: 255 - color.red, green: 255 - color.green, blue: 255 - color.blue, alpha: color.alpha)
        buffer[offset] = invertedColor
    }
}

수정된 이미지 가져오기

이미지를 수정한 후에는 수정된 이미지를 가져오는 것이 가능합니다.

// 수정된 이미지 가져오기
guard let modifiedImageRef = context.makeImage() else {
    // 수정된 이미지가 만들어지지 않을 경우의 처리
    return
}

let modifiedImage = UIImage(cgImage: modifiedImageRef)

Core Graphics를 이용하여 픽셀 단계별로 이미지를 조작하는 방법에 대해 알아보았습니다. 이를 응용하여 이미지 프로세싱 알고리즘을 구현하거나, 커스텀 이미지 필터링을 적용하는 등의 다양한 작업을 수행할 수 있습니다.

참고 자료: Ray Wenderlich - Working with Images in iOS