带有子视图的 UIImageView 屏幕截图剪辑

UIImageView screenshot clipping with subviews

我正在尝试截取一个 UIImageView 的屏幕截图,它具有可移动、可缩放和可旋转的 alpha(爱心,心脏具有 alpha 透明度,黑色边缘)- 在不动的 UIImageView 之上。

我想要完成的是允许用户将心形移动到顶部(已经有为此工作的代码)- 然后当他们单击下一步按钮时,它将截取心形的屏幕截图并捕获下面的图像。我将此代码通过截屏图像传递到 segue。这就是我目前所拥有的,这就是结果。

这是我当前的代码和 before/afters:

moveableMaskImageView是心形UIImageView
outletPreview 是下面的 UIImageView

#pragma screenshotImage:
- (UIImage *)screenShotImage {
CGRect rect = [moveableMaskImageView frame];
NSLog(@"Screenshot X: %f Screenshot Y: %f Screenshot W: %f Screenshot H: %f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[outletPreview.layer renderInContext:context];
[moveableMaskImageView.layer renderInContext:context];
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return capturedImage;
}

之前(定位):

之后:

我想问题是您只看到了所选内容的四分之一。

尝试替换

这个

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f);

有了这个

CGSize *size = CGSizeMake(rect.size.x *2, rect.size.y *2);
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);

我找到了问题的答案 - 我希望这对任何人都有帮助,因为它让我困惑了一段时间:

我没有使用我的屏幕截图功能来剪辑图像 - 我使用了我在互联网上找到的这段代码:

- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect {

UIGraphicsBeginImageContext(outletContainer.frame.size);/// use your screen or photo frame
[outletContainer.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGImageRef imageRef = CGImageCreateWithImageInRect([screenshot CGImage], rect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];

/*    no origin .....
 UIGraphicsBeginImageContext(tempview.frame.size);
 [[self.photo layer] renderInContext:UIGraphicsGetCurrentContext()];
 cropped= UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 */
return cropped;
}