Core Graphics イメージのグレースケール化
macOS 10.15.7 / Xcode 11.3.1 / Swift 5.0
Core Graphicsの機能を使って、イメージをグレースケール化してみる。
![[image3.png]](/swift/B66/image3.png)
![[allow.png]](/swift/B66/allow.png)
![[image4.png]](/swift/B66/image4.png)
ビットマップは、RGB値の集合である。ビットマップの1ピクセルは1個のRGB値を持つ。
ひとつの RGB値には4バイトが割り当てられる。最初の3バイトには、1バイトごとに Red/Green/Blueのそれぞれの値(0〜255)をセットする。4バイト目は未使用(ビットマップ以外の画像によっては alpha値を割り当てることもある)。ビットマップオブジェクトのサイズは、ピクセル数 x 4となる。
グレースケール化とは、各ビットマップの R値/G値/B値にそれぞれ特定の係数を掛け、グレースケールしたRGB値を求め、その値で元のRGBのそれぞれの値を置き換えることである。RGBはすべて同じ値になるのでモノクロ画像になる。係数の種類はいくつかあり、ここではHDTV係数を使用している。他には、NTSC係数などがある。
ビットマップオブジェクトを1バイト(UInt8)ごと処理するためには、bindMemory(to:capacity:)メソッドを使って、オブジェクトの先頭を指す UInt8型ポインタを取得する。これを使えば C言語的なポインタを使ったアクセスが可能となる。なお、このメソッドは UnsafePointer型のオブジェクトに対してのみ使える。