拉伸过滤
当我们使用图层显示图片时,理想情况下就是图片的像素和显示图片区域的像素比例为1:1。但是,许多情况下,图片是需要进行拉伸的。当图片需要显示不同的大小时,有一种叫做拉伸过滤的算法就起到作用了。它作用于原图的像素上并根据需要生成新的像素显示在屏幕上
图层提供了3种拉伸过滤算法。属性magnificationFilter
和minificationFilter
,它们默认都采用kCAFilterLinear
算法。
kCAFilterLinear
:通过对多个像素取样最终生成新的值,得到一个平滑的表现不错的拉伸。但是当放大倍数比较大的时候图片就模糊不清了kCAFilterNearest
:和kCAFilterLinear
非常相似,大部分情况下二者都看不出来有什么差别。但是,较双线性滤波算法而言,三线性滤波算法存储了多个大小情况下的图片(也叫多重贴图),并三维取样,同时结合大图和小图的存储进而得到最后的结果。它能够从一系列已经接近于最终大小的图片中得到想要的结果,也就是说不要对很多像素同步取样。这不仅提高了性能,也避免了小概率因舍入错误引起的取样失灵的问题kCAFilterTrilinear
:取样最近的单像素点而不管其他的颜色。这样做非常快,也不会使图片模糊。但是,最明显的效果就是,会使得压缩图片更糟,图片放大之后也显得块状或是马赛克严重。
效果展示:
总结:对于比较小的图或者是差异特别明显,极少斜线的大图,最近过滤算法会保留这种差异明显的特质以呈现更好的结果。但是对于大多数的图尤其是有很多斜线或是曲线轮廓的图片来说,最近过滤算法会导致更差的结果。换句话说,线性过滤保留了形状,最近过滤则保留了像素的差异。
组透明
实现组透明的两种方法:
- 在info.plist文件中,设置UIViewGroupOpacity(key为Renders with group opacity)为
YES
(iOS7及以上的版本默认为YES
); - 设置
CALayer
的一个叫做shouldRasterize
属性为YES
。在应用透明度之前,图层及其子图层都会被整合成一个整体的图片,这样就没有透明度混合的问题了。默认情况下,所有图层拉伸都是1.0, 所以如果使用了shouldRasterize
属性,就要确保设置rasterizationScale
属性去匹配屏幕,以防止出现Retina屏幕像素化的问题。