我有一个UIImageView(全帧和矩形),我正在用CGAffineTransform旋转。 UIImageView的UIImage填充整个帧。旋转和绘制图像时,边缘会出现明显的锯齿状。有什么我可以做的让它看起来更好吗?显然没有背景消除锯齿。
答案 0 :(得分:55)
默认情况下,iOS上CoreAnimation图层的边缘不会被抗锯齿。但是,您可以在Info.plist中设置一个键,以启用边缘的抗锯齿:UIViewEdgeAntialiasing。
如果您不希望启用此选项的性能开销,则可以解决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;
}