[iPhone] CALayer 画像をぼかす、モザイク化する (Objective-C)

CALayerを使うと画像のぼかしやモザイクを作ることができます。
 

Objective-C
Xcode 8.2.1

 

CALayer

 
CALayer の CA は Core Animationのことでアニメーションの画像処理系の重い処理に適しています。またUIViewと被っているような気もするのですが、その差は
CALayer
‘The CALayer class manages image-based content and allows you to perform animations on that content.’
 
アニメーション的な事はこちらが使いやすいということのようです
 
UIView
‘The UIView class defines a rectangular area on the screen and the interfaces for managing the content in that area.’
 
描画する領域について色々定義しているということでしょうか
 

画像をぼかし、モザイク化

 
まず、ラスタライズ化を設定します。これはベクター形式などの画像データをBMPのようなピクセル、ドットに置き換えることです。
imageView.layer.shouldRasterize = YES;
ラスタライズのスケールを設定します。
imageView.layer.rasterizationScale = 0.1;
 
これで、それなりの画像のぼけを出せます。

 
結果は
 
calayer_1
 


 
これは画像を縮小したものを拡大したらできるようです
実際にオーソドックスに画像を1/10にしてから10倍に拡大して見ました。
 

 
サンプリングが異なっているのかもしれませんが、
ぼけたモザイクっぽくなりました。
 
calayer_6
 
コード量は圧倒的に多いですが。
 


 
元にもどって、先ほどの画像は粗いので、これをローパスフィルターをかけるとぼやけた感がでてきます。スケーリングフィルターには3種類あり

  1. kCAFilterLinear (default)
    • いわゆる線形補間で2点間を結んだ線上に中間データを想定する
  2. kCAFilterNearest
    • 近傍補間は、近傍の4点の元データから目的のデータを計算する
  3. kCAFilterTrilinear
    • トリ・リニア補間は近傍補間に更にミニマップを追加した8点補間

この kCAFilterTrilinear を minificationFilter に追加すると
 
imageView.layer.minificationFilter = kCAFilterTrilinear;
 
calayer_2
 
となります。
 
先ほどのラスタライズのスケールを変更するとぼやけ感が変わります。
mageView.layer.rasterizationScale = 0.2;
 
calayer_3
 
また拡大する時の magnificationFilter に kCAFilterNearest を追加すると
imageView.layer.magnificationFilter= kCAFilterNearest;
 
calayer_4
 
モザイクになりました。
 
コードは下のようになります。
QuartzCore.framewark の追加を忘れずに
ViewController.m

 

アニメーションにする

 
モザイク画からフェードインするような演出を作ります。
 
rasterizationScale をキーにして CABasicAnimation のインスタンスを生成
duration でアニメーション期間を設定して、その間の開始と終了時のキー値を入れます。
imageView.layer に追加する
コードは以下のようになります。
 
ViewController.m

 
calayer_4
アニメーション5秒…
 

お疲れさま

お疲れさまでした


 
今回は たった3行で… を参考にさせていただきました。
 


ページのトップへ戻る

シェアする

  • このエントリーをはてなブックマークに追加

フォローする