[iPhone] 画像をぼかし・モザイク化する2つの方法

画像をぼかす、モザイク化するにはどうすればいいでしょうか。UIGraphicsBeginImageContextを使ったやり方やCALayerでラスタライズする方法もあります。


Xcode 13.4.1

ぼかし・モザイク化

画像を拡大縮小するときに使う補間やラスタライズなどを逆手にとるとモザイクのほうなボケた画像が作り出せます。これを作り出すために
UIGraphicsBeginImageContext, UIGraphicsEndImageContext
を使う方法とCALayerを使うやり方があります。

例えば、このような画像をモザイク化してみたいと思いますので、画像をAssetsに入れます。


UIGraphicsBeginImageContext

補間:

例えば画像を100x100pixから200x200pixに拡大するときに、足りない情報が出てきます
座標の[0,0] [1,1] ….
拡大 [0,0] [1,1] [2,2] …
元の[1,1]の画像データは拡大後に[2,2]として使えますが[1,1]の画像ピクセル情報が足りない。このときに補間という作業を行います。とても単純な例では元の[0,0] と [1,1] の両方を合計して平均を出して中間データとするのです。
画像は連続性がある程度あるので、なんとなく違和感の少ない画像を作り出せます。

モザイク画像は、逆にこの補間を一切やらないということで実現できます。

以下の例は、画像を1/10縮小してそれを元に戻す、つまり拡大ですが、ここで補間させないでそのまま拡大します。

ViewController.swift


このようなモザイク画像になりました。

CALayer

CALayerを使いラスタライズ化を設定します。これはベクター形式などの画像データをBMPのようなピクセル、ドットに置き換えることです。

imgView.layer.shouldRasterize = true;
ラスタライズのスケールを設定します。
imgView.layer.rasterizationScale = 0.1;

これで、それなりの画像のぼけを出せます。

ViewController.swift


CALayerを使う方は画質は多少異なりますが、コード量は少ないです。



ちなみに、imgView.layer.rasterizationScaleを0.1にしましたが1.0でやれば綺麗な元の画像になります。


関連ページ:

References:
UIGraphicsBeginImageContext(_:) — UIKit | Apple Developer Documentation
shouldRasterize — CALayer | Apple Developer Documentation