任何快速和肮脏的反锯齿技术的旋转UIImageView?
我有一个UIImageView(全画幅和矩形),我旋转与CGAffineTransform。 UIImageView的UIImage填充整个框架。 当图像旋转和绘制时,边缘显得明显锯齿状。 有什么我可以做,让它看起来更好? 这显然不是背景的反锯齿。
请记住设置适当的反别名选项:
CGContextSetAllowsAntialiasing(theContext, true); CGContextSetShouldAntialias(theContext, true);
CoreAnimation图层的边缘在iOS上默认情况下不是反锯齿。 不过,您可以在Info.plist中设置一个关键字来启用边缘的抗锯齿function:UIViewEdgeAlliiasing。
如果您不希望启用此选项的性能开销,解决方法是在图像的边缘周围添加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];