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

我有一个UIImageView(全画幅和矩形),我旋转与CGAffineTransform。 UIImageView的UIImage填充整个框架。 当图像旋转和绘制时,边缘显得明显锯齿状。 有什么我可以做,让它看起来更好? 这显然不是背景的反锯齿。

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

CGContextSetAllowsAntialiasing(theContext, true); CGContextSetShouldAntialias(theContext, true); 

CoreAnimation图层的边缘在iOS上默认情况下不是反锯齿。 不过,您可以在Info.plist中设置一个关键字来启用边缘的抗锯齿function:UIViewEdgeAlliiasing。

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

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

新API – iOS 6/7

也适用于iOS 6,正如@Chris所指出的,但是直到iOS 7才公开。

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

只需添加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(); 

只需在plist中添加“带边缘抗锯齿的渲染”,就可以工作了。

我会完全推荐以下库。

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

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

请享用!

我发现最好的方式有光滑的边缘和清晰的图像是这样做的:

 CGRect imageRect = CGRectMake(0, 0, self.photo.image.size.width, self.photo.image.size.height); UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0); [self.photo.image drawInRect:CGRectMake(1, 1, self.photo.image.size.width - 2, self.photo.image.size.height - 2)]; self.photo.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

像一些人所描述的那样添加Info.plist关键字对性能有很大的影响,如果你使用它,那么你基本上将它应用到所有的东西上,而不仅仅是一个你需要的地方。

另外,不要只使用UIGraphicsBeginImageContext(imageRect.size); 否则图层会模糊。 你必须像我所示的那样使用UIGraphicsBeginImageContextWithOptions

我从这里find了这个解决scheme,非常完美:

 + (UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame transparentInsets:(UIEdgeInsets)insets { CGSize imageSizeWithBorder = CGSizeMake(frame.size.width + insets.left + insets.right, frame.size.height + insets.top + insets.bottom); // Create a new context of the desired size to render the image UIGraphicsBeginImageContextWithOptions(imageSizeWithBorder, NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); // Clip the context to the portion of the view we will draw CGContextClipToRect(context, (CGRect){{insets.left, insets.top}, frame.size}); // Translate it, to the desired position CGContextTranslateCTM(context, -frame.origin.x + insets.left, -frame.origin.y + insets.top); // Render the view as image [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // Fetch the image UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext(); // Cleanup UIGraphicsEndImageContext(); return renderedImage; } 

用法:

 UIImage *image = [UIImage renderImageFromView:view withRect:view.bounds transparentInsets:UIEdgeInsetsZero];