当前位置: 首页 > 科技观察

图片变形抗锯齿方法

时间:2023-03-16 22:17:20 科技观察

前言周末在微博上看到@周凯雯Kevin在说CALayer抗锯齿。具体方法是:layer.allowsEdgeAntialiasing=true。贴纸的缩放和旋转都会有问题,所以aliasing的问题也需要解决,但是那时候是iOS4、5的时代,没有上面说的allowsEdgeAntialiasing这个东西(这个东西才发布在iOS7中,不过据说iOS6也可以用,不过是个黑科技。。。你懂的)所以当时求助于***stackoverflow,得到了一个很简单但不简单的方法,也就是我在微博上说的,只留一个像素的透明边缘,让图片显示。方法和方法比较简单。我写了一个UIImage的Category方法,在我的工具库里尘封了好几年(我才想起这个问题)-(UIImage*)antiAlias{CGFloatborder=1.0f;CGRectrect=CGRectMake(border,border,self.size.width-2*border,self.size.height-2*border);UIImage*img=nil;UIGraphicsBeginImageContext(CGSizeMake(rect.size.width,rect.size.height));[selfdrawInRect:CGRectMake(-1,-1,self.size.width,self.size.height)];img=UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();UIGraphicsBeginImageContext(self.size);[imgdrawInRect:rect];UIImage*antiImage=UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();returnantiImage;}先来看看实际效果吧。可以看到旋转的时候如果不做任何处理,会有明显的走样。使用透明边缘方法或设置allowsEdgeAntialAsing可以消除锯齿。接下来我们看看这两种方式的性能对比。测试方法是在我的iPhone5S上旋转对比500个UIImageView,对比帧数。结果如下结果表明,allowsEdgeAntialiasing的性能仍然优于透明边缘。所以……如果你的app需要支持iOS6-可以参考透明边的方法。唯一的缺点就是显示会比原来的小一点(我的做法是直接剪掉1px的边缘,当然你也可以直接在图片外面加上1px的透明边缘)如果你的应用只支持iOS7,那就是推荐使用allowsEdgeAntialiasing设置简单方便。如果性能有难度,可以考虑透明边的方法这个我也是临时写的,所以没花太多时间)如有错误请指出