画像をマスキングする方法については検索すれば色々とコードが出てくる。
それらを試してみて気になった点について調査してみる。
 
まずはマスキングを行うためのコードから見ていこう。

1.画像をマスキングするためのメソッド

2.マスクを作成する

3.マスキングを行う

4.以前はこの解放が必須だったが、現在はこの解放は必要ない。
 開放しようとすると、コンパイラが以下のようなエラーを吐く。
 'CGImageRelease' is unavailable: Core Foundation objects are automatically memory managed

そして、使用するイメージはこれ。
image
マスク用の画像はこれ。
mask_no_transparent
では、実行してみよう。
mask_image_ss1

このような結果が得られた。
特に問題は無い。

マスク用の画像についてもう少し調べてみる。
やり方はわかった。
しかし、マスク画像がどういう仕組であればいいのかが漠然としている。

公式ページに色々と書いているが、要は「黒なら透過、白ならブロック」と言っている。
Bitmap Images and Image Masks

ここで気をつけたいのは、ブロックするのは「白であって透過色ではない」ということだ。
先ほどのマスク画像
mask_no_transparent
これの白い部分を試しに透過色にしてみると、マスキングは行われない。
ARGBではなく、あくまでもRGBで考えなければいけないということだ。

さて、では「白か黒か」をどうやって考えればいいか。
というのも、24ビットRGBの場合は(0, 0, 0)が黒で(255, 255, 255)が白となるわけだが、赤(255, 0, 0)を使ったらどうなるか、検証してみよう。
mask_red
これを使用した結果はこうだ。
mask_image_ss2
何も表示されない。
つまり白扱いとしてブロックされているということだ。
では赤成分を半分にしてみよう(128, 0, 0)。
mask_dark_red
これを使用した結果はこうだ。
mask_image_ss3
ほぼ半透明の結果となった。

では緑成分を255にしたらどうなるか(128, 255, 0)。
mask_green
結果はこうだ。
mask_image_ss4
(128, 0, 0)の場合と変わらない結果となった。
RGBのどれかの値の最小値と最大値を見ているのかとも思ったが、そうではないようだ。

では(255, 128, 0)ならどうなるか。
mask_light_red
結果はこうだ。
mask_image_ss5
(255, 255, 255)の場合と同じ結果となった。

これらから導き出されるのは、(あくまでも推測だが)RGBのRの成分を見てマスキングが行われているのではないかということだ。

もちろん、この推測が間違っている可能性も十分あるし、将来的に変更される可能性があるので、マスク画像を作成する際はあくまでも白と黒で作成しておくのが無難だろう。