[Swift4/Cocoa] 画像のクラス(NSImage, CGImage, CIImage)の相互変換

2018年6月29日(更新: 2018年6月29日)

Cocoa Application における画像情報を表す以下の3つのクラスの形式を相互変換する方法についてです。

  • CGImage(Core Graphics Image)
  • CIImage(Core Image)
  • NSImage(NeXTSTEP Image)

CGImageからの変換

CGImage → CIImage

let ciImage = CIImage(cgImage: <変換したいCGImage>)

CGImage → NSImage

CGImage から NSImage への変換には、CGImage のサイズが必要となります。

let cgImage = <変換したいCGImage>

let nsImage = NSImage(cgImage: cgImage, size: NSSize(width: cgImage.width, height: cgImage.height))

CIImageからの変換

CIImage → CGImage

クラス CIContext を介して変換します。

let ciImage = <変換したいCIImage>

let cgImage = CIContext().createCGImage(ciImage, from: ciImage.extent)

CIImage → NSImage

CIImage の持つ情報を引き継ぐために、メソッド addRepresentation とクラス NSCIImageRep を利用します。

let ciImage = <変換したいCIImage>

let nsImage = NSImage(size: ciImage.extent.size)

nsImage.addRepresentation(NSCIImageRep(ciImage: ciImage))

NSImageからの変換

NSImage → CGImage

let nsImage = <変換したいNSImage>

var nsImageRect: CGRect = CGRect(x: 0, y: 0, width: nsImage.size.width, height: nsImage.size.height)

let cgImage = nsImage.cgImage(forProposedRect: &nsImageRect, context: nil, hints: nil)

NSImage → CIImage

上記の方法で一旦 CGImage に変換し、それを CIImage に変換します。

let nsImage = <変換したいNSImage>
        
var nsImageRect: CGRect = CGRect(x: 0, y: 0, width: nsImage.size.width, height: nsImage.size.height)
        
if let cgImage = nsImage.cgImage(forProposedRect: &nsImageRect, context: nil, hints: nil) {
    let ciImage = CIImage(cgImage: cgImage)
}

以上、画像の情報を持つ3つクラス(NSImage、CGImage、CIImage)の相互変換についてでした。

コメントを残す

メールアドレスが公開されることはありません。