NSImageをリサイズ

意外と複雑な画像のリサイズ。
やり方は色々ありそうですが、今回使った方法を記録しておきます。

大まかな流れは

  1. CGImageを準備
  2. CGContextを準備
  3. リサイズ後のサイズを指定
  4. contextを使って書き込む
  5. NSImageに戻す


まずはあらかじめ準備したNSImageからNSBitmapImageRepを取り出し、さらにCGImageを取り出す。

guard let image = NSBitmapImageRep(data: sourceImage.tiffRepresentation!)?.cgImage else {
    //  エラー処理
}

次に各種パラメータを準備して、CGContextを作成。

let bitsPerComponent = 8
let bytesPerRow = 4 * newWidth
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)

guard let bitmapContext = CGContext(data: nil, width: newWidth, height: newHeight, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) else {
    // エラー処理
}

サイズを指定して書き込む。

let bitmapSize = NSMakeSize(CGFloat(newWidth), CGFloat(newHeight))
let bitmapRect = NSMakeRect(0.0, 0.0, bitmapSize.width, bitmapSize.height)

bitmapContext.draw(image, in: bitmapRect)

最後にNSImageに戻す。

guard let newImageRef = bitmapContext.makeImage() else{
    // エラー処理
}
let newImage = NSImage(cgImage: newImageRef, size: bitmapSize)

0 件のコメント:

コメントを投稿

Touchdown 1.3公開!

Touchdown 1.3を公開しました。 ダウンロードは こちら から。 Ver.1.3の変更点は以下の通りです。 新機能 macOS Mojave 10.13以降に対応 ダークモードに対応 ぜひお試しください。