LoginSignup
13
11

More than 5 years have passed since last update.

iOSアプリでライブビューを表示せずに撮影する方法

Last updated at Posted at 2015-06-15

iOS開発で撮影の実装方法を調べると、ライブビュー表示中に撮影するものしか見つからなかったので、ライブビュー無しで撮影する方法を考えてみました。

注意

ストア申請通るかはまだ不明です。申請通り次第報告します。

参考サイト

http://swift-salaryman.com/avcapture.1.php
コードの大半はここを参考にしました。

コード

SecretCamera.swift

import UIKit
import AVFoundation

class SecretCamera: NSObject {

    var secretView : UIView!

    var stillImageOutput: AVCaptureStillImageOutput!
    var captureSession: AVCaptureSession!
    var videoconnection: AVCaptureConnection!

    func open()
    {
        //スクリーンの幅
        let screenWidth = UIScreen.mainScreen().bounds.size.width;
        //スクリーンの高さ
        let screenHeight = UIScreen.mainScreen().bounds.size.height;

        self.secretView = UIView(frame: CGRectMake(0.0, 0.0, screenWidth, screenHeight))
    }

    func configureCamera() -> Bool {
        // init camera device
        var captureDevice: AVCaptureDevice?
        var devices: NSArray = AVCaptureDevice.devices()

        // find back camera
        for device: AnyObject in devices {
            if device.position == AVCaptureDevicePosition.Front {
                captureDevice = device as? AVCaptureDevice
            }
        }

        if (captureDevice != nil) {
            // Debug
            println(captureDevice!.localizedName)
            println(captureDevice!.modelID)
        } else {
            println("Missing Camera")
            return false
        }

        var error: NSErrorPointer = nil
        var deviceInput: AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as! AVCaptureInput

        self.stillImageOutput = AVCaptureStillImageOutput()

        // init session
        self.captureSession = AVCaptureSession()
        self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto
        self.captureSession.addInput(deviceInput as AVCaptureInput)
        self.captureSession.addOutput(self.stillImageOutput)

        // layer for preview
        var previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(self.captureSession) as! AVCaptureVideoPreviewLayer
        previewLayer.frame = secretView.frame
        //self.view.layer.addSublayer(previewLayer)

        self.captureSession.startRunning()

        return true
    }

    func takePhoto(){
        if let stillOutput = self.stillImageOutput {
            //スレッドで安全に利用してクラッシュしないように
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                //ビデオコネクションを探す
                //self.videoconnection = AVCaptureConnection()!
                if let videoConnection = stillOutput.connectionWithMediaType(AVMediaTypeVideo){
                    self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection){
                        (imageSampleBuffer : CMSampleBuffer!, _) in
                        let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
                        var pickedImage: UIImage = UIImage(data: imageDataJpeg)!
                        UIImageWriteToSavedPhotosAlbum(pickedImage, nil, nil, nil)
                    }
                    self.captureSession.stopRunning()
                }
            }
        }
    }
}

使い方

 open → configureCamera → takePhoto の順で呼び出すだけ

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11