swift 照片拍摄黑色图像
swift photo capture black image
我正在尝试使用 Swift 设置 AVFoundation 照片捕获。预览 window 工作正常,但是当我按下按钮拍摄照片时,应用程序启动后拍摄的第一张照片是全黑的。我在应用程序的同一实例 运行 中拍摄的任何后续照片都可以正常工作,但第一张总是只是一个黑色矩形。拍照时预览层也会闪黑。这是我用于相机的代码:
import UIKit
import AVFoundation
class photoCaptureViewController: UIViewController {
let session : AVCaptureSession = AVCaptureSession()
var previewLayer : AVCaptureVideoPreviewLayer!
var output = AVCaptureStillImageOutput()
var capturedImage : UIImage!
override func viewDidLoad() {
super.viewDidLoad()
let device = getFrontCamera()
var error : NSError? = nil
let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
if input != nil {
session.addInput(input)
}else{
println(error)
}
session.sessionPreset = AVCaptureSessionPresetPhoto
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
previewLayer.frame = CGRectMake(0, 0, 300, 300)
previewLayer.setAffineTransform( CGAffineTransformTranslate(CGAffineTransformMakeScale(0.33, 0.33), -375, -480) )
previewLayer.position = CGPointMake((photoButton.layer.position.x + 70), (photoButton.layer.position.y - 45))
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.view.layer.addSublayer(previewLayer)
self.setPreviewOrientation()
session.startRunning()
}
func setPreviewOrientation() {
let previewLayerConnection: AVCaptureConnection = self.previewLayer.connection
let orientation = AVCaptureVideoOrientation(rawValue: UIDevice.currentDevice().orientation.rawValue)
previewLayerConnection.videoOrientation = orientation!
}
@IBAction func photoButtonPressed(sender: UIButton)
{
output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if session.canAddOutput(output)
{
session.addOutput(output)
}
var videoConnection = output.connectionWithMediaType(AVMediaTypeVideo)
if videoConnection != nil {
output.captureStillImageAsynchronouslyFromConnection(output.connectionWithMediaType(AVMediaTypeVideo))
{ (imageDataSampleBuffer, error) -> Void in
self.capturedImage = UIImage(data: AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer))
UIImageWriteToSavedPhotosAlbum(self.capturedImage, self,nil, nil)
}}
}
func getFrontCamera() -> AVCaptureDevice{
var result : AVCaptureDevice!
var devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
for device in devices{
if (device.position == AVCaptureDevicePosition.Front) {
result = device as! AVCaptureDevice
}
}
return result
}
}
此问题已通过移动
output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if session.canAddOutput(output)
{
session.addOutput(output)
}
在 viewDidLoad 下,而不是在照片捕获功能中。
我正在尝试使用 Swift 设置 AVFoundation 照片捕获。预览 window 工作正常,但是当我按下按钮拍摄照片时,应用程序启动后拍摄的第一张照片是全黑的。我在应用程序的同一实例 运行 中拍摄的任何后续照片都可以正常工作,但第一张总是只是一个黑色矩形。拍照时预览层也会闪黑。这是我用于相机的代码:
import UIKit
import AVFoundation
class photoCaptureViewController: UIViewController {
let session : AVCaptureSession = AVCaptureSession()
var previewLayer : AVCaptureVideoPreviewLayer!
var output = AVCaptureStillImageOutput()
var capturedImage : UIImage!
override func viewDidLoad() {
super.viewDidLoad()
let device = getFrontCamera()
var error : NSError? = nil
let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
if input != nil {
session.addInput(input)
}else{
println(error)
}
session.sessionPreset = AVCaptureSessionPresetPhoto
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
previewLayer.frame = CGRectMake(0, 0, 300, 300)
previewLayer.setAffineTransform( CGAffineTransformTranslate(CGAffineTransformMakeScale(0.33, 0.33), -375, -480) )
previewLayer.position = CGPointMake((photoButton.layer.position.x + 70), (photoButton.layer.position.y - 45))
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.view.layer.addSublayer(previewLayer)
self.setPreviewOrientation()
session.startRunning()
}
func setPreviewOrientation() {
let previewLayerConnection: AVCaptureConnection = self.previewLayer.connection
let orientation = AVCaptureVideoOrientation(rawValue: UIDevice.currentDevice().orientation.rawValue)
previewLayerConnection.videoOrientation = orientation!
}
@IBAction func photoButtonPressed(sender: UIButton)
{
output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if session.canAddOutput(output)
{
session.addOutput(output)
}
var videoConnection = output.connectionWithMediaType(AVMediaTypeVideo)
if videoConnection != nil {
output.captureStillImageAsynchronouslyFromConnection(output.connectionWithMediaType(AVMediaTypeVideo))
{ (imageDataSampleBuffer, error) -> Void in
self.capturedImage = UIImage(data: AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer))
UIImageWriteToSavedPhotosAlbum(self.capturedImage, self,nil, nil)
}}
}
func getFrontCamera() -> AVCaptureDevice{
var result : AVCaptureDevice!
var devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
for device in devices{
if (device.position == AVCaptureDevicePosition.Front) {
result = device as! AVCaptureDevice
}
}
return result
}
}
此问题已通过移动
output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if session.canAddOutput(output)
{
session.addOutput(output)
}
在 viewDidLoad 下,而不是在照片捕获功能中。