旋转UIImageView的任何快速和脏的抗锯齿技术?

Mel*_*emi 26 iphone cocoa-touch antialiasing uiimageview uiimage

我有一个UIImageView(全帧和矩形),我正在用CGAffineTransform旋转.UIImageView的UIImage填充整个帧.旋转和绘制图像时,边缘会出现明显的锯齿状.有什么我可以做的让它看起来更好吗?显然没有背景消除锯齿.

Joh*_*ool 55

默认情况下,iOS上CoreAnimation图层的边缘不会被抗锯齿.但是,您可以在Info.plist中设置一个键,以启用边缘的抗锯齿:UIViewEdgeAntialiasing.

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html

如果您不希望启用此选项的性能开销,则解决方法是在图像边缘周围添加1px透明边框.这意味着图像的"边缘"不再位于边缘,因此不需要特殊处理!

  • 这超级甜蜜!如此简单,又如此强大!:d (2认同)

Pat*_*pel 27

新API - iOS 6/7

同样适用于iOS 6,如@Chris所述,但直到iOS 7才公开.

从iOS 7开始,CALayer拥有一个新属性allowsEdgeAntialiasing,在这种情况下完全符合您的要求,而不会产生为应用程序中的所有视图启用它的开销!这是CALayer的属性,因此要为您使用的UIView启用此属性 myView.layer.allowsEdgeAntialiasing = YES.


G S*_*G S 17

只需为图像添加1px透明边框即可

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0);
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)


Nat*_*ies 9

请记住设置适当的反别名选项:

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
Run Code Online (Sandbox Code Playgroud)

  • 解决该问题的最佳方法是在旋转之前为图像添加1px透明边框. (5认同)
  • 1px透明边框起到了作用! (2认同)
  • 有人可以提供这个1px透明边框技巧的提示吗?我已经设置了UIView的layer.borderColor和layer.borderWidth,但它并没有为我修复它. (2认同)

San*_*ndy 6

只需在plist中添加"带边缘抗锯齿的渲染",并且它将起作用.


Swa*_*way 5

我完全推荐以下库.

http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

它包含许多有用的UIImage扩展,可以解决这个问题,还包括生成缩略图等的代码.

请享用!