カメラのプレビューと同じサイズのUIImageの切り出しについて
背面カメラで静止画が撮影できるアプリを作っています。
カメラからの映像用に、プレビュー用のレイヤーを(x:100、Y:60、Width:545、Height:538)で作成しました。
プレビュー用のレイヤーはAVLayerVideoGravityResizeAspectFillで、アスペクト比は、
そのままで、レイヤーからはみ出した部分は隠すようにしています。
撮影して生成されるUIimageは隠れた部分も含んでいるため、
プレビュー用のレイヤーに表示されている部分だけ切り出したいと
思いましたが、うまくいきませんでした。
撮影したそのままの画像サイズは1920x1080でした。
これを縮小して、さらにトリミングするようなイメージになるのでしょうか?
表示プレビューと同じUIImageを生成する方法を教えていただけないでしょうか。
var videoDataOutput : AVCaptureStillImageOutput!
var videoLayer: AVCaptureVideoPreviewLayer!
var cpsSession : AVCaptureSession!
var captureDevice: AVCaptureDevice!
for device: AnyObject in AVCaptureDevice.devices() {
if device.position == AVCaptureDevicePosition.Back {
captureDevice = device as! AVCaptureDevice
}
}
let deviceInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: nil) as! AVCaptureDeviceInput
videoDataOutput = AVCaptureStillImageOutput()
self.cpsSession = AVCaptureSession()
if (self.cpsSession.canAddInput(deviceInput)) {
self.cpsSession.addInput(deviceInput as AVCaptureDeviceInput)
}
if (self.cpsSession.canAddOutput(videoDataOutput)) {
self.cpsSession.addOutput(videoDataOutput)
}
// プレビュー用のビューを設定
videoLayer = AVCaptureVideoPreviewLayer.layerWithSession(cpsSession) as! AVCaptureVideoPreviewLayer
videoLayer.frame = CGRectMake(100, 60, 545, 538)
videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
videoLayer.masksToBounds = true
self.view.layer.addSublayer(videoLayer)
cpsSession.startRunning()
//切り出し処理
let cropRect = CGRectMake(0, 0, CGFloat(545), CGFloat(538))
let cropRef = CGImageCreateWithImageInRect(image.CGImage, cropRect)
let cropImage = UIImage(CGImage: cropRef)
//保存
UIImageWriteToSavedPhotosAlbum(cropImage, self, nil, nil)