質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4227閲覧

swiftでAVCaptureVideoDataOutputを使って位置情報付きの写真を撮影、保存したい

natting

総合スコア6

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/06/03 13:05

###前提・実現したいこと
xcode8.3 swiftでカメララプリを作っています。
AVCaptureVideoDataOutputで位置情報付きの写真が撮れるアプリを作るのが目標。
現在地の取得は後で付け足すとして、
http://qiita.com/oggata/items/0e35195b983187dfb7f9
http://qiita.com/swdyh/items/60d97e74058a93448a19
や書籍を参考に、exif情報つきの写真を撮れるようにしようとしています。

###発生している問題・エラーメッセージ
とりあえずコンパイルして実機で動くようになりましたが、
写真は撮れても肝心のexif情報が入っていません。
ALAssetLibraryが廃止になったこともあり、参考になる情報が見つからず途方に暮れています。
位置情報付きの写真をフォトライブラリに保存する方法がわかる方、ご教授いただけたら幸いです。

エラーメッセージ

###該当のソースコード

// // ViewController.swift // locationCam // // Created by shinpei on 2017/06/03. // Copyright © 2017年 shinpei. All rights reserved. // import UIKit import AVFoundation import ImageIO import Photos import MobileCoreServices class ViewController: UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate { //プレビューを表示するview @IBOutlet weak var previewView: UIView! var input = AVCaptureDeviceInput()//入力デバイス var output = AVCaptureVideoDataOutput()//出力データ var session = AVCaptureSession()//AVCaptureのセッション開始状態 var camera:AVCaptureDevice!//使うカメラ var stillImage:CGImage! //exif情報を準備する var gps = NSMutableDictionary() var exif = NSMutableDictionary() var meta = NSMutableDictionary() //シャッター @IBAction func takePhoto(_ sender: Any) { if var _:AVCaptureConnection? = output.connection(withMediaType: AVMediaTypeVideo){ //UIImageWriteToSavedPhotosAlbum(self.stillImage, self, nil, nil) let tmpName = ProcessInfo.processInfo.globallyUniqueString let tmpUrl = NSURL.fileURL(withPath: NSTemporaryDirectory() + tmpName + ".jpg") if let dest = CGImageDestinationCreateWithURL(tmpUrl as CFURL, kUTTypeJPEG, 1, nil) { CGImageDestinationAddImage(dest, stillImage, meta) CGImageDestinationFinalize(dest) PHPhotoLibrary.shared() .performChanges({ PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: tmpUrl) } ) } } } override func viewDidLoad() { super.viewDidLoad() cameraSetup() previewSetup() exifSetup() } //カメラのセットアップ(入力、出力) func cameraSetup (){ //ビデオ出力の解像度 session.sessionPreset = AVCaptureSessionPresetHigh //どのカメラを使うか決める camera = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) //入力をセッションに追加 do { //inputにカメラのデバイス情報を入れてみてうまくいったら //セッションにinputを追加する input = try AVCaptureDeviceInput(device: camera) as AVCaptureDeviceInput if(session.canAddInput(input)){ session.addInput(input) } else { print("入力エラー") return } } catch let error as NSError { print(error) return } //出力設定 //先にセッションに出力を追加? if(session.canAddOutput(output)){ session.addOutput(output) } else { print("出力エラー") return } //ピクセルフォーマット output.videoSettings = [kCVPixelBufferPixelFormatTypeKey as AnyHashable : Int(kCVPixelFormatType_32BGRA)] //フレームをキャプチャするためのサブスレッッド用のシリアルキューを用意? output.setSampleBufferDelegate(self, queue: DispatchQueue.main) output.alwaysDiscardsLateVideoFrames = true //セッションの開始 session.startRunning() //deviceをロックして設定?意味わからん do { try camera.lockForConfiguration() camera.activeVideoMinFrameDuration = CMTimeMake(1, 30) camera.unlockForConfiguration() } catch _ { } } //プレビューを表示 func previewSetup(){ let previewLayer = AVCaptureVideoPreviewLayer(session: session) guard let videoLayer = previewLayer else { print("プレビュー不可") return } videoLayer.frame = view.bounds videoLayer.masksToBounds = true videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill previewView.layer.addSublayer(videoLayer) } //AVCaptureVideoDataOutputSampleBufferDelegateで宣言されてるfunc func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { let image:UIImage = self.captureImage(sampleBuffer) stillImage = image.cgImage } //画像の設定? func captureImage(_ sampleBuffer:CMSampleBuffer) -> UIImage{ let imageBuffer:CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: CVOptionFlags(0))) let baseAddress:UnsafeMutableRawPointer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)! let bytesPerRow:Int = CVPixelBufferGetBytesPerRow(imageBuffer) let width:Int = CVPixelBufferGetWidth(imageBuffer) let height:Int = CVPixelBufferGetHeight(imageBuffer) //色空間 let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() //let bitsPerCompornent:Int = 8 //swift 2.0 let newContext:CGContext = CGContext(data: baseAddress, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue|CGBitmapInfo.byteOrder32Little.rawValue)! let imageRef:CGImage = newContext.makeImage()! let resultImage = UIImage(cgImage: imageRef, scale: 1.0, orientation: UIImageOrientation.up) return resultImage } func exifSetup(){ //ハワイの位置情報? gps.setObject(1111,forKey:kCGImagePropertyGPSDateStamp as! NSCopying) gps.setObject(1111,forKey:kCGImagePropertyGPSTimeStamp as! NSCopying) gps.setObject("N",forKey:kCGImagePropertyGPSLatitudeRef as! NSCopying) gps.setObject(21.275468,forKey:kCGImagePropertyGPSLatitude as! NSCopying) gps.setObject("W",forKey:kCGImagePropertyGPSLongitudeRef as! NSCopying) gps.setObject(157.825294,forKey:kCGImagePropertyGPSLongitude as! NSCopying) gps.setObject(0,forKey:kCGImagePropertyGPSAltitudeRef as! NSCopying) gps.setObject(0,forKey:kCGImagePropertyGPSAltitude as! NSCopying) exif.setObject("test", forKey: kCGImagePropertyExifUserComment as! NSCopying) exif.setObject(gps, forKey: kCGImagePropertyGPSDictionary as! NSCopying) meta.setObject(exif,forKey:kCGImagePropertyExifDictionary as! NSCopying) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

###補足情報(言語/FW/ツール等のバージョンなど)
xcode8.3.2
swift
iPhone7Plus実機でテスト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

swift

1 exif.setObject("test", forKey: kCGImagePropertyExifUserComment as! NSCopying) 2 exif.setObject(gps, forKey: kCGImagePropertyGPSDictionary as! NSCopying) 3 4 meta.setObject(exif,forKey:kCGImagePropertyExifDictionary as! NSCopying)

を下記に書き換えたら解決しました。

swift

1 exif.setObject("test", forKey: kCGImagePropertyExifUserComment as! NSCopying) 2 3 meta.setObject(exif,forKey:kCGImagePropertyExifDictionary as! NSCopying) 4 meta.setObject(gps, forKey: kCGImagePropertyGPSDictionary as! NSCopying)

投稿2017/06/03 14:38

natting

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問