Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > カメラで写真をとる(#1)

カメラで写真をとる(#1)

iPhoneのカメラを利用して撮影します。
(1回目は背面カメラを起動してフォーカスを当てるところまでを説明します)

XXXXXXX

参考(英語): Taking control of the iPhone camera in iOS 8 with Swift (Part 1)

AVCaptureDeviceで利用できるカメラを確認する


//利用できるカメラを確認する
import AVFoundation

 let captureSession = AVCaptureSession();
captureSession.sessionPreset = AVCaptureSessionPresetLow;
 let devices = AVCaptureDevice.devices();
 println(devices);

こんな感じで出力されます。(私のiPhone5S/iOS8の場合)


[AVCaptureFigVideoDevice: 0x156d19200 
[Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0],
AVCaptureFigVideoDevice: 0x156d1c6c0
[Front Camera][com.apple.avfoundation.avcapturedevice.built-in_video:1],
AVCaptureFigAudioDevice: 0x170873d00
[iPhone マイク][com.apple.avfoundation.avcapturedevice.built-in_audio:0]]

AVCaptureVideoPreviewLayerカメラ画像を表示する


    import AVFoundation


    let captureSession = AVCaptureSession()
    var previewLayer : AVCaptureVideoPreviewLayer?
    var captureDevice : AVCaptureDevice?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        captureSession.sessionPreset = AVCaptureSessionPresetHigh
        let devices = AVCaptureDevice.devices()
        for device in devices {
            if (device.hasMediaType(AVMediaTypeVideo)) {
                // 背面カメラあるかどうか。ここを調整して全面カメラにしたりもできる
                if(device.position == AVCaptureDevicePosition.Back) {
                    captureDevice = device as? AVCaptureDevice
                    if captureDevice != nil {
                        println("背面カメラ発見しました。")
                        beginCamera()
                    }
                }
            }
        }
        
    }
    
    
    //カメラ設定
    func configureDevice() {
        if let device = captureDevice {
            device.lockForConfiguration(nil)
            device.focusMode = .Locked
            device.unlockForConfiguration()
        }
        
    }
    
    //カメラ開始!
    func beginCamera() {
        
        configureDevice()
        var err : NSError? = nil
        captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
        
        if err != nil {
            println("エラー: \(err?.localizedDescription)")
        }
        
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        self.view.layer.addSublayer(previewLayer)
        previewLayer?.frame = self.view.layer.frame
        captureSession.startRunning()
    }

カメラをタッチ動作でフォーカスさせる

以下コードを上記に追加します。overrideなのでそのまま関数を追加するだけ


    //フォーカス!
    func focusTo(value : Float) {
        if let device = captureDevice {
            if(device.lockForConfiguration(nil)) {
                device.setFocusModeLockedWithLensPosition(value, completionHandler: { (time) -> Void in
                    //
                })
                device.unlockForConfiguration()
            }
        }
    }
    
    //画面にタッチ
    let screenWidth = UIScreen.mainScreen().bounds.size.width
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        var anyTouch = touches.anyObject() as UITouch
        var touchPercent = anyTouch.locationInView(self.view).x / screenWidth
        focusTo(Float(touchPercent))
    }
    
    //タッチして移動
    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        var anyTouch = touches.anyObject() as UITouch
        var touchPercent = anyTouch.locationInView(self.view).x / screenWidth
        focusTo(Float(touchPercent))
    }

撮影できたので共有です。2015/4/23

上記とやり方が違うのですが撮影できたので共有します。


import UIKit
import AVFoundation

class ViewController: UIViewController{
    var stillImageOutput: AVCaptureStillImageOutput!
    var captureSession: AVCaptureSession!
    var videoconnection: AVCaptureConnection!
    
    override func viewDidLoad() {
    }
    override func viewDidAppear(animated: Bool) {
        configureCamera();
        takePhoto();
    }
    
    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.Back {
                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 = self.view.bounds
        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()!
                for connecton in stillOutput.connections {
                    //入力ポートを探す
                    for port in connecton.inputPorts!{
                        if port.mediaType == AVMediaTypeVideo {
                            self.videoconnection = connecton as! AVCaptureConnection
                            break //ポート
                        }
                    }
                    if self.videoconnection  != nil {
                        break//接続
                    }
                }
                if self.videoconnection  != nil {
                    self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(self.videoconnection){
                        (imageSampleBuffer : CMSampleBuffer!, _) in
                        let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
                        var pickedImage: UIImage = UIImage(data: imageDataJpeg)!
                    }
                    self.captureSession.stopRunning()
                }
            }
        }
    }
    
    
}

Timerで撮影させたいのですが、それができずに苦戦中

↓こんな記事もありますよ!

UITextViewでテキストを複数行表示する

UITextFieldは一行表示ですが、UITextFieldは複数行を表示することができます。

UIToolBar

画面の端っこに追加できるツールバーコントロール。アプリにピリッとアクセントを付けます。機能を追加したい時に便利です

メモリの動きとポインタ

Swiftとポインターはあまり縁がないのかなと思っていたのですが、開発を進めていると 時々このUnsafePointerの名前を見ることがあります。本日はこのPointerが何を表しているかを調査してみます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!