ScalingFilters

三种不同的 Scaling Filters

  • kCAFilterLinear
  • kCAFilterNearest
  • kCAFilterTrilinear

三种 Scaling Filters 的特点

kCAFilterLinear 使用 Bilinear filtering 算法,采样多个象素来生成最终的图象。

优点: 圆滑,流畅
缺点: 如果放大的比较够大,图象会出现模糊
kCAFilterTrilinear 跟 kCAFilterLinear 类似。大多数情况下,两者在视觉上并没有太大 的差异。但是 kCAFilterTrilinear 保存多个图象的尺寸(Mip-mapping),然后在三个不同的维 度采样,组合较大和较小的存储的图象,来生成最终的图象。kCAFilterTrilinear 改善了性能。

优点: 由于最终的图象的在尽寸跟保存的图象已经非常接近,所以不用同时采样较多的象素,从而提 高了性能和避免了在 scale factors 较小的情况下出现的问题(rounding errors)。
kCAFilterNearest 就像它的名字暗示一样,只会采用最接近的单象素,并且不对颜色进行渲染。

优点: 速度非常快, 保留原来图象,只处理边缘部分 缺点: 图象质量很差,出现象素化

总结

Linear filtering 保留形状,kCAFilterLinear 和 kCAFilterTrilinear。 Nearest-neighbor filtering 保留象素, kCAFilterNearest。

例子

当我们不设置 magnificationFilter , 默认为 kCAFilterLinear。图象就变得非常模糊。

1
2
3
view.layer.contents = digits?.CGImage
view.layer.contentsRect = CGRectMake(0, 0, 0.1, 0.1)
view.layer.contentsGravity = kCAGravityResizeAspect

当我们把 magnificationFilter 设置成 kCAFilterNearest,字体马上变得很清晰,原因是我们使用的 backing image 是很小的,我们把图象的 frame 调置成比原来图象大时,图象就会变得 模糊。

1
2
3
4
5

view.layer.contents = digits?.CGImage
view.layer.contentsRect = CGRectMake(0, 0, 0.1, 0.1)
view.layer.contentsGravity = kCAGravityResizeAspect
view.layer.magnificationFilter = kCAFilterNearest