codecamp

4.5 拉伸过滤

拉伸过滤

    最后我们再来谈谈minificationFiltermagnificationFilter属性。总得来讲当我们视图显示一个图片的时候都应该正确地显示这个图片意即以正确的比例和正确的11像素显示在屏幕上。原因如下

  • 能够显示最好的画质像素既没有被压缩也没有被拉伸。
  • 能更好的使用内存因为这就是所有你要存储的东西。
  • 最好的性能表现CPU不需要为此额外的计算。

    不过有时候显示一个非真实大小的图片确实是我们需要的效果。比如说一个头像或是图片的缩略图再比如说一个可以被拖拽和伸缩的大图。这些情况下为同一图片的不同大小存储不同的图片显得又不切实际。

    当图片需要显示不同的大小的时候有一种叫做拉伸过滤的算法就起到作用了。它作用于原图的像素上并根据需要生成新的像素显示在屏幕上。

    事实上重绘图片大小也没有一个统一的通用算法。这取决于需要拉伸的内容放大或是缩小的需求等这些因素。CALayer为此提供了三种拉伸过滤方法他们是

  • kCAFilterLinear
  • kCAFilterNearest
  • kCAFilterTrilinear

    minification缩小图片和magnification放大图片默认的过滤器都是kCAFilterLinear这个过滤器采用双线性滤波算法它在大多数情况下都表现良好。双线性滤波算法通过对多个像素取样最终生成新的值得到一个平滑的表现不错的拉伸。但是当放大倍数比较大的时候图片就模糊不清了。

    kCAFilterTrilinearkCAFilterLinear非常相似大部分情况下二者都看不出来有什么差别。但是较双线性滤波算法而言三线性滤波算法存储了多个大小情况下的图片也叫多重贴图并三维取样同时结合大图和小图的存储进而得到最后的结果。

    这个方法的好处在于算法能够从一系列已经接近于最终大小的图片中得到想要的结果也就是说不要对很多像素同步取样。这不仅提高了性能也避免了小概率因舍入错误引起的取样失灵的问题

图4.15 对于没有斜线的小图来说最近过滤算法要好很多

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

    让我们来实验一下。我们对第三章的时钟项目改动一下用LCD风格的数字方式显示。我们用简单的像素字体一种用像素构成字符的字体而非矢量图形创造数字显示方式用图片存储起来而且用第二章介绍过的拼合技术来显示如图4.16。

4.4 图层蒙板
4.6 组透明
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

11. 基于定时器的动画

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }