質問編集履歴

2

2017/03/13 00:21

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes

1

UIImageへの変換はできた

2017/03/13 00:21

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -6,405 +6,383 @@
6
6
 
7
7
 
8
8
 
9
- 実機でビルドすると撮影はできているのですが(シャッター音が鳴るので)、以下のエラーが出てとってしまいます
10
-
11
-
12
-
13
- ###発生している問題・エラーメッセージ
9
+ imageBufferがCoreDataに保存できません
10
+
11
+
12
+
13
+
14
+
15
+ ###該当のソースコード
16
+
17
+ ```Swift3
18
+
19
+ // ViewController
20
+
21
+ // 撮影するコード
22
+
23
+ if let output = myImageOutput {
24
+
25
+ DispatchQueue.global().async {
26
+
27
+ let connection = output.connection(withMediaType: AVMediaTypeVideo)
28
+
29
+ let settings = [-2.0, 0.0, 2.0].map {
30
+
31
+ (bias: Float) -> AVCaptureAutoExposureBracketedStillImageSettings in AVCaptureAutoExposureBracketedStillImageSettings.autoExposureSettings(withExposureTargetBias: bias)
32
+
33
+ }
34
+
35
+ output.captureStillImageBracketAsynchronously(from: connection, withSettingsArray: settings, completionHandler: { (imageBuffer, settings, error) in
36
+
37
+
38
+
39
+ //print("imageBuffer: \(imageBuffer)")
40
+
41
+
42
+
43
+ if error == nil {
44
+
45
+ let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageBuffer)!
46
+
47
+ if let image = UIImage(data: imageData) {
48
+
49
+ UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) }
50
+
51
+
52
+
53
+ }
54
+
55
+
56
+
57
+ else {
58
+
59
+
60
+
61
+ print("error while capturing still image: \(error)")
62
+
63
+
64
+
65
+ }
66
+
67
+ })
68
+
69
+ }
70
+
71
+ }
72
+
73
+
74
+
75
+ // 毎フレームをCoreDataに保存する処理
76
+
77
+ func writeBuffer(imageBuffer: CVPixelBuffer) -> NSData {
78
+
79
+ CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
80
+
81
+ let bufferSize = CVPixelBufferGetDataSize(imageBuffer)
82
+
83
+ let width = CVPixelBufferGetWidth(imageBuffer)
84
+
85
+ let height = CVPixelBufferGetHeight(imageBuffer)
86
+
87
+ let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
88
+
89
+ let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
90
+
91
+ let colorSpace = CGColorSpaceCreateDeviceRGB()
92
+
93
+ var data: NSData = NSData(bytes: baseAddress, length: bufferSize)
94
+
95
+ CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
96
+
97
+ let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
98
+
99
+ let myContext: NSManagedObjectContext = appDelegate.managedObjectContext
100
+
101
+
102
+
103
+ let myEntity: NSEntityDescription! = NSEntityDescription.entity(forEntityName: "ImageData", in: myContext)
104
+
105
+ let newData = ImageData(entity: myEntity, insertInto: myContext)
106
+
107
+ newData.imageData? = data
108
+
109
+ do {
110
+
111
+ try myContext.save()
112
+
113
+ } catch {
114
+
115
+ print(error)
116
+
117
+ }
118
+
119
+ return data
120
+
121
+ }
14
122
 
15
123
 
16
124
 
17
125
  ```
18
126
 
127
+
128
+
129
+ ###試したこと
130
+
131
+ プロジェクト作成時にUse CoreDataにチェック入れてなかったので、新しいファイル(CoreData > DataModel)を作成し、.xcdatamodeledファイルを追加しました。
132
+
133
+ EntityはimageDataにし、TypeはBinary Dataです。
134
+
135
+ その後、Editor > Create NSManagedObject Subclassでエンティティモデルコードを生成しました。
136
+
137
+ そのあと、appDelegateに以下のコードを書き加えました
138
+
139
+ ```ここに言語を入力
140
+
141
+ lazy var applicationDocumentsDirectory: NSURL = {
142
+
143
+ let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
144
+
145
+ return urls[urls.count-1] as NSURL
146
+
147
+ }()
148
+
149
+ lazy var managedObjectModel: NSManagedObjectModel = {
150
+
19
- *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:] - Not a jpeg sample buffer.'
151
+ // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
152
+
20
-
153
+ let modelURL = Bundle.main.url(forResource: "ImageDataBase", withExtension: "momd")!
154
+
21
-
155
+ return NSManagedObjectModel(contentsOf: modelURL)!
156
+
157
+ }()
158
+
159
+ lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
160
+
161
+ // Create the coordinator and store
162
+
163
+ let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
164
+
165
+ let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
166
+
167
+ var failureReason = "There was an error creating or loading the application's saved data."
168
+
169
+ do {
170
+
171
+ try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
172
+
173
+ } catch {
174
+
175
+ // Report any error we got.
176
+
177
+ var dict = [String: AnyObject]()
178
+
179
+ dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
180
+
181
+ dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
182
+
183
+ dict[NSUnderlyingErrorKey] = error as NSError
184
+
185
+
186
+
187
+ let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
188
+
189
+
190
+
191
+ NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
192
+
193
+
194
+
195
+ abort()
196
+
197
+
198
+
199
+ }
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+ return coordinator
208
+
209
+
210
+
211
+ }()
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+ lazy var managedObjectContext: NSManagedObjectContext = {
220
+
221
+
222
+
223
+ let coordinator = self.persistentStoreCoordinator
224
+
225
+
226
+
227
+ var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
228
+
229
+
230
+
231
+ managedObjectContext.persistentStoreCoordinator = coordinator
232
+
233
+
234
+
235
+ return managedObjectContext
236
+
237
+
238
+
239
+ }()
240
+
241
+
242
+
243
+
244
+
245
+ @available(iOS 10.0, *)
246
+
247
+
248
+
249
+ lazy var persistentContainer: NSPersistentContainer = {
250
+
251
+
252
+
253
+ let container = NSPersistentContainer(name: "coredataTest")
254
+
255
+
256
+
257
+ container.loadPersistentStores(completionHandler: { (storeDescription, error) in
258
+
259
+
260
+
261
+ if let error = error as NSError? {
262
+
263
+
264
+
265
+ fatalError("Unresolved error \(error), \(error.userInfo)")
266
+
267
+
268
+
269
+ }
270
+
271
+
272
+
273
+ })
274
+
275
+
276
+
277
+ return container
278
+
279
+
280
+
281
+ }()
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+ func saveContext () {
290
+
291
+
292
+
293
+ if #available(iOS 10.0, *) {
294
+
295
+
296
+
297
+ let context = persistentContainer.viewContext
298
+
299
+
300
+
301
+ if context.hasChanges {
302
+
303
+
304
+
305
+ do {
306
+
307
+
308
+
309
+ try context.save()
310
+
311
+
312
+
313
+ } catch {
314
+
315
+
316
+
317
+ let nserror = error as NSError
318
+
319
+
320
+
321
+ fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
322
+
323
+
324
+
325
+ }
326
+
327
+
328
+
329
+ }
330
+
331
+
332
+
333
+ } else {
334
+
335
+
336
+
337
+ if managedObjectContext.hasChanges {
338
+
339
+
340
+
341
+ do {
342
+
343
+
344
+
345
+ try managedObjectContext.save()
346
+
347
+
348
+
349
+ } catch {
350
+
351
+
352
+
353
+ let nserror = error as NSError
354
+
355
+
356
+
357
+ NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
358
+
359
+
360
+
361
+ abort()
362
+
363
+
364
+
365
+ }
366
+
367
+
368
+
369
+ }
370
+
371
+
372
+
373
+ }
374
+
375
+
376
+
377
+ }
22
378
 
23
379
  ```
24
380
 
25
381
 
26
382
 
27
-
28
-
29
- ###該当のソースコード
30
-
31
- ```Swift3
32
-
33
- // ViewController
34
-
35
- // 撮影するコード
36
-
37
- if let output = myImageOutput {
38
-
39
- DispatchQueue.global().async {
40
-
41
- let connection = output.connection(withMediaType: AVMediaTypeVideo)
42
-
43
- let settings = [-2.0, 0.0, 2.0].map {
44
-
45
- (bias: Float) -> AVCaptureAutoExposureBracketedStillImageSettings in AVCaptureAutoExposureBracketedStillImageSettings.autoExposureSettings(withExposureTargetBias: bias)
46
-
47
- }
48
-
49
- output.captureStillImageBracketAsynchronously(from: connection, withSettingsArray: settings, completionHandler: { (imageBuffer, settings, error) in
50
-
51
-
52
-
53
- //print("imageBuffer: \(imageBuffer)")
54
-
55
-
56
-
57
- if error == nil {
58
-
59
- let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageBuffer)!
60
-
61
- if let image = UIImage(data: imageData) {
62
-
63
- UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) }
64
-
65
-
66
-
67
- }
68
-
69
-
70
-
71
- else {
72
-
73
-
74
-
75
- print("error while capturing still image: \(error)")
76
-
77
-
78
-
79
- }
80
-
81
- })
82
-
83
- }
84
-
85
- }
86
-
87
-
88
-
89
- // 毎フレームをCoreDataに保存する処理
90
-
91
- func writeBuffer(imageBuffer: CVPixelBuffer) -> NSData {
92
-
93
- CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
94
-
95
- let bufferSize = CVPixelBufferGetDataSize(imageBuffer)
96
-
97
- let width = CVPixelBufferGetWidth(imageBuffer)
98
-
99
- let height = CVPixelBufferGetHeight(imageBuffer)
100
-
101
- let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
102
-
103
- let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
104
-
105
- let colorSpace = CGColorSpaceCreateDeviceRGB()
106
-
107
- var data: NSData = NSData(bytes: baseAddress, length: bufferSize)
108
-
109
- CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
110
-
111
- let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
112
-
113
- let myContext: NSManagedObjectContext = appDelegate.managedObjectContext
114
-
115
-
116
-
117
- let myEntity: NSEntityDescription! = NSEntityDescription.entity(forEntityName: "ImageData", in: myContext)
118
-
119
- let newData = ImageData(entity: myEntity, insertInto: myContext)
120
-
121
- newData.imageData? = data
122
-
123
- do {
124
-
125
- try myContext.save()
126
-
127
- } catch {
128
-
129
- print(error)
130
-
131
- }
132
-
133
- return data
134
-
135
- }
136
-
137
-
138
-
139
- ```
140
-
141
-
142
-
143
- ###試したこと
144
-
145
- プロジェクト作成時にUse CoreDataにチェック入れてなかったので、新しいファイル(CoreData > DataModel)を作成し、.xcdatamodeledファイルを追加しました。
146
-
147
- EntityはimageDataにし、TypeはBinary Dataです。
148
-
149
- その後、Editor > Create NSManagedObject Subclassでエンティティモデルコードを生成しました。
150
-
151
- そのあと、appDelegateに以下のコードを書き加えました
152
-
153
- ```ここに言語を入力
154
-
155
- lazy var applicationDocumentsDirectory: NSURL = {
156
-
157
- let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
158
-
159
- return urls[urls.count-1] as NSURL
160
-
161
- }()
162
-
163
- lazy var managedObjectModel: NSManagedObjectModel = {
164
-
165
- // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
166
-
167
- let modelURL = Bundle.main.url(forResource: "ImageDataBase", withExtension: "momd")!
168
-
169
- return NSManagedObjectModel(contentsOf: modelURL)!
170
-
171
- }()
172
-
173
- lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
174
-
175
- // Create the coordinator and store
176
-
177
- let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
178
-
179
- let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
180
-
181
- var failureReason = "There was an error creating or loading the application's saved data."
182
-
183
- do {
184
-
185
- try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
186
-
187
- } catch {
188
-
189
- // Report any error we got.
190
-
191
- var dict = [String: AnyObject]()
192
-
193
- dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
194
-
195
- dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
196
-
197
- dict[NSUnderlyingErrorKey] = error as NSError
198
-
199
-
200
-
201
- let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
202
-
203
-
204
-
205
- NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
206
-
207
-
208
-
209
- abort()
210
-
211
-
212
-
213
- }
214
-
215
-
216
-
217
-
218
-
219
-
220
-
221
- return coordinator
222
-
223
-
224
-
225
- }()
226
-
227
-
228
-
229
-
230
-
231
-
232
-
233
- lazy var managedObjectContext: NSManagedObjectContext = {
234
-
235
-
236
-
237
- let coordinator = self.persistentStoreCoordinator
238
-
239
-
240
-
241
- var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
242
-
243
-
244
-
245
- managedObjectContext.persistentStoreCoordinator = coordinator
246
-
247
-
248
-
249
- return managedObjectContext
250
-
251
-
252
-
253
- }()
254
-
255
-
256
-
257
-
258
-
259
- @available(iOS 10.0, *)
260
-
261
-
262
-
263
- lazy var persistentContainer: NSPersistentContainer = {
264
-
265
-
266
-
267
- let container = NSPersistentContainer(name: "coredataTest")
268
-
269
-
270
-
271
- container.loadPersistentStores(completionHandler: { (storeDescription, error) in
272
-
273
-
274
-
275
- if let error = error as NSError? {
276
-
277
-
278
-
279
- fatalError("Unresolved error \(error), \(error.userInfo)")
280
-
281
-
282
-
283
- }
284
-
285
-
286
-
287
- })
288
-
289
-
290
-
291
- return container
292
-
293
-
294
-
295
- }()
296
-
297
-
298
-
299
-
300
-
301
-
302
-
303
- func saveContext () {
304
-
305
-
306
-
307
- if #available(iOS 10.0, *) {
308
-
309
-
310
-
311
- let context = persistentContainer.viewContext
312
-
313
-
314
-
315
- if context.hasChanges {
316
-
317
-
318
-
319
- do {
320
-
321
-
322
-
323
- try context.save()
324
-
325
-
326
-
327
- } catch {
328
-
329
-
330
-
331
- let nserror = error as NSError
332
-
333
-
334
-
335
- fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
336
-
337
-
338
-
339
- }
340
-
341
-
342
-
343
- }
344
-
345
-
346
-
347
- } else {
348
-
349
-
350
-
351
- if managedObjectContext.hasChanges {
352
-
353
-
354
-
355
- do {
356
-
357
-
358
-
359
- try managedObjectContext.save()
360
-
361
-
362
-
363
- } catch {
364
-
365
-
366
-
367
- let nserror = error as NSError
368
-
369
-
370
-
371
- NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
372
-
373
-
374
-
375
- abort()
376
-
377
-
378
-
379
- }
380
-
381
-
382
-
383
- }
384
-
385
-
386
-
387
- }
388
-
389
-
390
-
391
- }
392
-
393
- ```
394
-
395
-
396
-
397
383
  ###補足情報(言語/FW/ツール等のバージョンなど)
398
384
 
399
- let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageBuffer)!
400
-
401
- if let image = UIImage(data: imageData) {
402
-
403
- UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
404
-
405
- を消すと、CoreDataに保存は出来ていませんが、エラー無く撮影を終えることが出来ます。
406
-
407
- このときprint("imageBuffer: \(imageBuffer)")とすると、imageBuffuerの中には値も入っています。
385
+ print("imageBuffer: \(imageBuffer)")とすると、imageBuffuerの中には値も入っています。
408
386
 
409
387
  CoreDataに保存できているかどうかの確認は、Window>Devicesから実機simulator、該当アプリを選択して表示されるフォルダに特に何も追加されていないので保存できていないと判断しました。
410
388