问题描述
我正在截取一些 UIButtons 的屏幕截图,它们是大约 500 宽和 500 高的圆圈.由于屏幕截图只能以方形形式制作,而且我不想在图像周围出现白角,因此我使用了以下代码:
I am taking a screenshot of some UIButtons which are circles about 500 width and 500 height. Since the screenshot can only be made in square form, and I didn't wan't white corners around the image I used this code:
UIGraphicsBeginImageContext(self.Button3.layer.bounds.size);
[self.Button3.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* image2 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData* data = UIImagePNGRepresentation(image);
[data writeToFile:BusinessCardPath atomically:YES];
这很完美,它只返回一张没有白角的圆圈的照片.但它不能放大,因为它会丢失像素,并且它没有在镜头中包含 UIButton 上的所有元素,例如 UILabels,但不包括 UIButton 的子视图.
This works perfectly, it returns me a photo of only the circle without white corners. But it can' be enlarged as it will lose pixels, and it doesn't include in the shot all elements such as UILabels that are over the UIButton, but not a subview of the UIButton.
如果我使用此代码:
CGSize imageSize = CGSizeMake(310, 310);
UIGraphicsBeginImageContext(self.Button3.layer.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
/*CGContextTranslateCTM(context, -5, -50);*/
// Iterate over every window from back to front
for (UIWindow *window in [[UIApplication sharedApplication] windows])
{
if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
{
// -renderInContext: renders in the coordinate space of the layer,
// so we must first apply the layer's geometry to the graphics context
CGContextSaveGState(context);
// Center the context around the window's anchor point
CGContextTranslateCTM(context, [window center].x, [window center].y);
// Apply the window's transform about the anchor point
CGContextConcatCTM(context, [window transform]);
// Offset by the portion of the bounds left of and above the anchor point
CGContextTranslateCTM(context,
-[window bounds].size.width * [[window layer] anchorPoint].x,
-[window bounds].size.height * [[window layer] anchorPoint].y);
// Render the layer hierarchy to the current context
[[window layer] renderInContext:context];
// Restore the context
CGContextRestoreGState(context);
}
}
// Retrieve the screenshot image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
...我得到了相反的效果.上面的元素包含在截图中,高分辨率,但图像周围的白角在那里.
...I get the opposite effect. Elements above are included in the screenshot, high resolution, but the white corners around the image are there.
推荐答案
您可以使用 CAShapeLayer 来屏蔽图像的某些部分..path 属性用于定义将要渲染的区域.
You can use a CAShapeLayer to mask portions of the image. The .path property is used to define the area that will be rendered.
UIImageView *myImageView = [UIImageView alloc] init];
myImageView.image = [UIImage imageNamed:@"anImage.gif"];
[myImageView setClipsToBounds:YES];
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:myImageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(48, 48)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = myImageView.bounds;
maskLayer.path = maskPath.CGPath;
myImageView.layer.mask = maskLayer;
那应该会给你一个圆形图像.您可能需要玩弄半径.
That should give you a circle image. You may need to play with the radius.
这篇关于截取circle IOS的截图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!