美文网首页
Core Animation:拉伸过滤和组透明

Core Animation:拉伸过滤和组透明

作者: 黄龙辉 | 来源:发表于2016-02-22 16:09 被阅读133次

    拉伸过滤

    当我们使用图层显示图片时,理想情况下就是图片的像素和显示图片区域的像素比例为1:1。但是,许多情况下,图片是需要进行拉伸的。当图片需要显示不同的大小时,有一种叫做拉伸过滤的算法就起到作用了。它作用于原图的像素上并根据需要生成新的像素显示在屏幕上

    图层提供了3种拉伸过滤算法。属性magnificationFilterminificationFilter,它们默认都采用kCAFilterLinear算法。

    • kCAFilterLinear:通过对多个像素取样最终生成新的值,得到一个平滑的表现不错的拉伸。但是当放大倍数比较大的时候图片就模糊不清了

    • kCAFilterNearest:和kCAFilterLinear非常相似,大部分情况下二者都看不出来有什么差别。但是,较双线性滤波算法而言,三线性滤波算法存储了多个大小情况下的图片(也叫多重贴图),并三维取样,同时结合大图和小图的存储进而得到最后的结果。它能够从一系列已经接近于最终大小的图片中得到想要的结果,也就是说不要对很多像素同步取样。这不仅提高了性能,也避免了小概率因舍入错误引起的取样失灵的问题

    • kCAFilterTrilinear:取样最近的单像素点而不管其他的颜色。这样做非常快,也不会使图片模糊。但是,最明显的效果就是,会使得压缩图片更糟,图片放大之后也显得块状或是马赛克严重。

    效果展示:

    左边采用了kCAFilterLinear,右边采用kCAFilterNearest 左边采用了kCAFilterLinear,右边采用kCAFilterNearest

    总结:对于比较小的图或者是差异特别明显,极少斜线的大图,最近过滤算法会保留这种差异明显的特质以呈现更好的结果。但是对于大多数的图尤其是有很多斜线或是曲线轮廓的图片来说,最近过滤算法会导致更差的结果。换句话说,线性过滤保留了形状,最近过滤则保留了像素的差异。

    组透明

    实现组透明的两种方法:

    1. 在info.plist文件中,设置UIViewGroupOpacity(key为Renders with group opacity)为YES(iOS7及以上的版本默认为YES);
    2. 设置CALayer的一个叫做shouldRasterize属性为YES。在应用透明度之前,图层及其子图层都会被整合成一个整体的图片,这样就没有透明度混合的问题了。默认情况下,所有图层拉伸都是1.0, 所以如果使用了shouldRasterize属性,就要确保设置rasterizationScale属性去匹配屏幕,以防止出现Retina屏幕像素化的问题。

    相关文章

      网友评论

          本文标题:Core Animation:拉伸过滤和组透明

          本文链接:https://www.haomeiwen.com/subject/lbythttx.html