在视图中使用相机对应用程序进行屏幕快照会返回空白图像

时间:2018-07-25 11:01:31

标签: ios swift

我有以下代码来拍摄该应用的屏幕截图:

    var imageSize = CGSize.zero

    let orientation = UIApplication.shared.statusBarOrientation
    if UIInterfaceOrientationIsPortrait(orientation) {
        imageSize = UIScreen.main.bounds.size
    } else {
        imageSize = CGSize(width: UIScreen.main.bounds.size.height, height: UIScreen.main.bounds.size.width)
    }

    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
    for window in UIApplication.shared.windows {
        window.drawHierarchy(in: window.bounds, afterScreenUpdates: true)
    }

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    self.captureImageView.image = image

这是我显示相机的代码:

    let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)

    do {
        let input = try AVCaptureDeviceInput(device: captureDevice!)

        captureSession = AVCaptureSession()
        captureSession?.addInput(input)
    } catch {
        print(error)
    }

    videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
    videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
    videoPreviewLayer?.frame = view.layer.bounds
    self.cameraView.layer.addSublayer(videoPreviewLayer!)

    let previewLayerConnection: AVCaptureConnection? = videoPreviewLayer?.connection
    if previewLayerConnection?.isVideoOrientationSupported != nil {
        previewLayerConnection?.videoOrientation = AVCaptureVideoOrientation.landscapeLeft
    }

    captureSession?.startRunning()

关于这个问题,我已经尝试了其他stackoverflow用户的所有尝试,但实际上并没有奏效。可能是什么原因以及如何解决?

2 个答案:

答案 0 :(得分:0)

for window in UIApplication.shared.windows {
    window.drawHierarchy(in: window.bounds, afterScreenUpdates: true)
}

在这里您将窗口用作屏幕截图视图。默认情况下,您的窗口颜色为black,这就是为什么您获得黑色屏幕截图的原因。

使用视图控制器子视图之一。

尝试获取具有更新代码的第一个屏幕截图。然后用相机实施。

您的代码应如下所示

view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)

答案 1 :(得分:0)

在我的一个项目中,我使用此功能来获取经过爬坡处理的图像。

  func screenshotTaken(){
        UIGraphicsBeginImageContext(self.view.bounds.size)
        self.view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let screenShot = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.captureImageView.image = screenShot
    }