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

时间:2009-07-16 08:10:22

标签: iphone cocoa-touch uiimageview uiimage antialiasing

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

8 个答案:

答案 0 :(得分:55)

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

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

如果您不希望启用此选项的性能开销,则可以解决add a 1px transparent border around the edge of the image问题。这意味着图像的“边缘”不再位于边缘,因此不需要特殊处理!

答案 1 :(得分:26)

新API - iOS 6/7

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

从iOS 7开始,CALayer有一个新的属性allowsEdgeAntialiasing,它可以完全满足您的需要,而不会产生为应用程序中的所有视图启用它的开销!这是CALayer的一个属性,因此要为UIView启用此功能,请使用myView.layer.allowsEdgeAntialiasing = YES

答案 2 :(得分: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();

答案 3 :(得分:9)

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

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

答案 4 :(得分:6)

只需在plist中添加“带边缘抗锯齿的渲染”,并使用YES即可。

答案 5 :(得分:5)

我完全推荐以下库。

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

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

享受!

答案 6 :(得分:2)

我发现具有平滑边缘和清晰图像的最佳方法是:

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

答案 7 :(得分:0)

我从here找到了这个解决方案,它很完美:

WordApp.Selection.Start = 0
WordApp.Selection.End = 0
WordApp.Selection.InsertParagraphBefore

用法:

+ (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;
}