HOME > カメラで写真をとる(#1)
iPhoneのカメラを利用して撮影します。
(1回目は背面カメラを起動してフォーカスを当てるところまでを説明します)
//利用できるカメラを確認する
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]]
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))
}
上記とやり方が違うのですが撮影できたので共有します。
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で撮影させたいのですが、それができずに苦戦中
2021-05-14 14:21:41 | WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。
AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、
昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は... |
2021-05-06 14:04:37 | LINEのアニメーションスタンプ制作の落とし穴、、、失敗談
ゴールデンウィークにLINEスタンプを作成してみました。
作り切って申請も通したんですが、意図したアニメーションと違う、、、、
LINEクリエーターの画面だと、アニメーションのプレビュー... |
2021-05-01 18:05:35 | 久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。
忘れないようにメモ
エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。
ターゲット→ex... |
Tweet | |||
|