[swift] Swift Core Graphics로 픽셀 단계별로 조작하기
Swift의 Core Graphics 프레임워크를 사용하면 이미지에 픽셀 수준에서 직접적인 조작을 할 수 있습니다. 이 기술은 이미지 프로세싱, 커스텀 이미지 필터링, 캔버스 그리기 어플리케이션 등 다양한 그래픽 작업에 유용하게 활용될 수 있습니다.
이번 튜토리얼에서는 Core Graphics를 사용하여 이미지의 각 픽셀을 확인하고 조작하는 방법에 대해 살펴보겠습니다.
이미지로부터 픽셀 데이터 가져오기
Core Graphics를 사용하여 이미지로부터 픽셀 데이터를 가져오기 위해서는 다음과 같은 단계를 따릅니다.
- UIImage 객체를 생성합니다.
- UIImage의
cgImage
프로퍼티를 사용하여 CGImage 객체를 가져옵니다. - 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