Цель-C: захват скриншота всех видов в пользовательской рамке


У меня есть игра, в которой пользователи могут создавать собственные уровни и загружать их на мой сервер для других пользователей, и я хочу получить скриншот "области действия", прежде чем пользователь проверит свой уровень, чтобы загрузить его на мой сервер в виде "предварительного изображения".

Я знаю, как получить скриншот всего представления, но я хочу определить его в пользовательский кадр. Рассмотрим следующий образ:

область действий

Я хочу просто сделать скриншот области красным цветом, " область действия.- А Я Могу добиться этого?

2 4

2 ответа:

Просто вам нужно сделать прямую кишку из области, которую вы хотите захватить, и передать прямую кишку в методе.

Свифт 3.x:

extension UIView {
  func imageSnapshot() -> UIImage {
    return self.imageSnapshotCroppedToFrame(frame: nil)
  }

  func imageSnapshotCroppedToFrame(frame: CGRect?) -> UIImage {
    let scaleFactor = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(bounds.size, false, scaleFactor)
    self.drawHierarchy(in: bounds, afterScreenUpdates: true)
    var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    if let frame = frame {
        let scaledRect = frame.applying(CGAffineTransform(scaleX: scaleFactor, y: scaleFactor))

        if let imageRef = image.cgImage!.cropping(to: scaledRect) {
            image = UIImage(cgImage: imageRef)
        }
    }
    return image
  }
}

//How to call :
imgview.image = self.view.imageSnapshotCroppedToFrame(frame: CGRect.init(x: 0, y: 0, width: 320, height: 100))

Цель С:

-(UIImage *)captureScreenInRect:(CGRect)captureFrame 
{
    CALayer *layer;
    layer = self.view.layer;
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    CGContextClipToRect (UIGraphicsGetCurrentContext(),captureFrame);
    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenImage;
}

//How to call :
imgView.image = [self captureScreenInRect:CGRectMake(0, 0, 320, 100)];
- (UIImage *) getScreenShot {
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
    CGRect rect = [keyWindow bounds];
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [keyWindow.layer renderInContext:context];   
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}