【问题标题】:AVCaptureSession Image Is Size Of Screen [closed]AVCaptureSession 图像是屏幕大小 [关闭]
【发布时间】:2016-01-18 17:12:07
【问题描述】:

我正在使用 AVCaptureSession 创建一个相机,并尝试用它拍照。这是加载相机的代码...

func reloadCamera() {

    cameraView.backgroundColor = UIColor.clearColor()

    captureSession = AVCaptureSession()

    captureSession!.sessionPreset = AVCaptureSessionPresetHigh

    let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    if (camera == false) {
        let videoDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)

        for device in videoDevices {
            let device = device as! AVCaptureDevice
            if device.position == AVCaptureDevicePosition.Front {
                captureDevice = device
                break

            } else {
                captureDevice = backCamera
            }
        }

    } else {
        captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    }

    do {
        let input = try AVCaptureDeviceInput(device: captureDevice)
        if captureSession!.canAddInput(input) {
            captureSession!.addInput(input)

            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
            if captureSession!.canAddOutput(stillImageOutput) {
                captureSession!.addOutput(stillImageOutput)

                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
                previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait
                previewLayer?.frame = cameraView.bounds
                cameraView.layer.addSublayer(previewLayer!)
                captureSession!.startRunning()

            }
        }
    } catch let error as NSError {
        // Handle any errors
        print(error)
    }

}

这是我拍照的方式...

func didPressTakePhoto(){
    toggleFlash()

    if let videoConnection = stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){
        videoConnection.videoOrientation = (previewLayer?.connection.videoOrientation)!
        stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {
            (sampleBuffer, error) in


            if sampleBuffer != nil {
                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)

                self.capturedImage = UIImage(data: imageData)

                if self.camera == true {
                    self.capturedImage = UIImage(CGImage: self.capturedImage.CGImage!, scale: 1.0, orientation: UIImageOrientation.Right)

                } else {
                    self.capturedImage = UIImage(CGImage: self.capturedImage.CGImage!, scale: 1.0, orientation: UIImageOrientation.LeftMirrored)

                }



                self.tempImageView.image = self.capturedImage

                UIImageWriteToSavedPhotosAlbum(self.capturedImage, nil, nil, nil);

                self.tempImageView.hidden = false
                self.goButton.hidden = false
                self.cameraView.hidden = true
                self.removeImageButton.hidden = false
                self.captureButton.hidden = true
                self.flashChanger.hidden = true
                self.switchCameraButton.hidden = true

            }


        })
    }
}

但是发生的情况是拍摄的图片与整个屏幕一样大(如 Snapchat),但我只希望它与我从中获取它的 UIView 一样大。告诉我您是否需要更多信息。谢谢!

【问题讨论】:

  • “但是发生的事情是拍摄的图片与整个屏幕一样大”实际上我希望它会比这大得多。你怎么知道它有多大?我没有看到任何捕获图片或对捕获的图片执行任何操作的代码。

标签: ios swift uiimageview uiimage avcapturesession


【解决方案1】:

首先,您是将捕获会话的预设设置为 AVCaptureSessionPresetHigh。如果您不需要,请不要这样做;使用较小尺寸的预设。例如,使用 AVCaptureSessionPreset640x480 来获得更小的尺寸。

其次,无论生成的照片大小如何,将其缩小到您需要的大小并以该大小显示,完全取决于您。归根结底,这只是图像视图的大小和内容模式的问题,尽管最好还是减小图像大小,以避免浪费内存(就像您通过显示明显更大的图像所做的那样然后显示用户的内容)。

【讨论】:

  • 我刚刚更新了我的问题以显示我是如何拍摄照片的,但我将如何制作它以裁剪掉照片的其余部分?
  • 我不知道您所说的“它会裁剪掉图片的其余部分”是什么意思。您只显示了这一行:self.tempImageView.image = self.capturedImage 好的,所以现在我们知道它与图像视图有关。但是你没有说任何关于该图像视图的设置(它的大小,它的内容模式是什么,它是否剪辑到边界——所有这些都是至关重要的)。在自动布局下,默认行为是图像视图采用其图像的大小,因此据我了解,您所看到的或多或少是我所期望的行为。
  • 它设置为方面填充,我不剪辑到边界,但无论如何,我确实需要保存 UIImageView 中显示的图像,并且 clipToBounds 只修改 UIImageView 的图像。
  • “我确实需要保存图像,因为它显示在 UIImageView 中”啊哈。你知道这是你第一次澄清这个小事实吗?如果这是问题 - 如何以图像视图中显示的大小/裁剪保存图像 - 那么这就是你应该问的问题。
  • 好的抱歉,我的问题这么不清楚,我应该提出一个更好的问题。但是你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2016-12-08
  • 2015-08-07
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多