質問編集履歴

7

やってみたことを追記

2019/01/22 09:51

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -256,12 +256,312 @@
256
256
 
257
257
 
258
258
 
259
- ### 追記
259
+ ### 追記1
260
-
260
+
261
- 以下でもダメでした
261
+ ラの実装部分
262
262
 
263
263
  ```VB
264
264
 
265
+ Imports System.Drawing
266
+
267
+ Imports System.Runtime.InteropServices
268
+
269
+
270
+
271
+ #Region "Private変数"
272
+
273
+
274
+
275
+ Private mGrp As IGraphBuilder 'グラフ
276
+
277
+ Private mFlt As IBaseFilter 'キャプチャフィルタ
278
+
279
+ Private mPin As IPin 'キャプチャフィルタの出力ピン
280
+
281
+ Private mSmp As ISampleGrabber 'サンプルグラバフィルタ
282
+
283
+
284
+
285
+ Private mSize As Size '映像サイズ
286
+
287
+ Private mBuff As IntPtr 'ビットマップ取得用バッファ
288
+
289
+
290
+
291
+ Private mFmt As PIXELFORMATYPE 'ピクセル形式
292
+
293
+
294
+
295
+ Private mVisible As Boolean 'カメラ映像を表示するか?
296
+
297
+
298
+
299
+ #End Region
300
+
301
+
302
+
303
+ '----一部省略----
304
+
305
+
306
+
307
+ Public Function snapShot() As Bitmap
308
+
309
+ If mGrp Is Nothing Or mSmp Is Nothing Then Throw New Exception("キャプチャーが取得できません。")
310
+
311
+
312
+
313
+ 'イメージの取得
314
+
315
+ Try
316
+
317
+ '画像データサイズ取得
318
+
319
+ Dim bmpsz As Integer = 0
320
+
321
+ mSmp.GetCurrentBuffer(bmpsz, IntPtr.Zero)
322
+
323
+
324
+
325
+ '画像取得領域確保
326
+
327
+ Dim bmpptr As IntPtr = Marshal.AllocHGlobal(bmpsz)
328
+
329
+
330
+
331
+ 'イメージ取得
332
+
333
+ mSmp.GetCurrentBuffer(bmpsz, bmpptr)
334
+
335
+
336
+
337
+ '画像サイズを取得
338
+
339
+ Dim vsz As Size
340
+
341
+ vsz = GetVideoSize(mGrp)
342
+
343
+ '描画
344
+
345
+ Dim bmpdata As Bitmap
346
+
347
+ bmpdata = New Bitmap(vsz.Width, vsz.Height, vsz.Width * 3, Imaging.PixelFormat.Format24bppRgb, bmpptr)
348
+
349
+ bmpdata.RotateFlip(RotateFlipType.RotateNoneFlipY) '上下反転させる
350
+
351
+
352
+
353
+ snapShot = bmpdata
354
+
355
+ Catch ex As Exception
356
+
357
+ Throw New Exception("スナップショットに失敗しました。" & " : " & ex.Message, ex)
358
+
359
+ End Try
360
+
361
+ End Function
362
+
363
+ ```
364
+
365
+
366
+
367
+ ### 追記2
368
+
369
+ 色々調べてIDisposable実装してみました……。
370
+
371
+ これでうまく動くのが一番理想ですがまだ動きません……。
372
+
373
+
374
+
375
+ DataDto.vb
376
+
377
+ ```VB
378
+
379
+ Public Class DataDto
380
+
381
+ Implements IDisposable
382
+
383
+
384
+
385
+ #Region "プロパティ"
386
+
387
+
388
+
389
+ ''' <summary>画像ファイルパス</summary>
390
+
391
+ Public Property ImageFilePath As String
392
+
393
+
394
+
395
+ ''' <summary>画像格納用(スナップショット格納用)</summary>
396
+
397
+ Public Property SnapShotImage As System.Drawing.Image = Nothing
398
+
399
+
400
+
401
+ #End Region
402
+
403
+
404
+
405
+ #Region "メソッド"
406
+
407
+
408
+
409
+ ''' <summary>
410
+
411
+ ''' データをコピーする
412
+
413
+ ''' </summary>
414
+
415
+ ''' <param name="target">コピー先対象</param>
416
+
417
+ ''' <remarks></remarks>
418
+
419
+ Public Sub CopyData(ByRef target As DataDto)
420
+
421
+ target.ImageFilePath = ImageFilePath
422
+
423
+ target.SnapShotImage = SnapShotImage?.Clone
424
+
425
+ End Sub
426
+
427
+
428
+
429
+ ''' <summary>
430
+
431
+ ''' データをクリアにする
432
+
433
+ ''' </summary>
434
+
435
+ ''' <remarks></remarks>
436
+
437
+ Public Sub Clear()
438
+
439
+ ImageFilePath = Nothing
440
+
441
+ SnapShotImage = Nothing
442
+
443
+ End Sub
444
+
445
+
446
+
447
+ ''' <summary>
448
+
449
+ ''' 同一データの作成(別インスタンス)
450
+
451
+ ''' </summary>
452
+
453
+ ''' <remarks></remarks>
454
+
455
+ Public Function Clone() As DataDto
456
+
457
+ Dim dto As New DataDto With {
458
+
459
+ .ImageFilePath = ImageFilePath,
460
+
461
+ .SnapShotImage = SnapShotImage?.Clone
462
+
463
+ }
464
+
465
+
466
+
467
+ Return dto
468
+
469
+ End Function
470
+
471
+
472
+
473
+ #End Region
474
+
475
+
476
+
477
+ #Region "コンストラクタ"
478
+
479
+
480
+
481
+ Public Sub New()
482
+
483
+ Me.Clear()
484
+
485
+ End Sub
486
+
487
+
488
+
489
+ #End Region
490
+
491
+
492
+
493
+ #Region "IDisposable Support"
494
+
495
+ Private disposedValue As Boolean ' 重複する呼び出しを検出するには
496
+
497
+
498
+
499
+ ' IDisposable
500
+
501
+ Protected Overridable Sub Dispose(disposing As Boolean)
502
+
503
+ If Not disposedValue Then
504
+
505
+ If disposing Then
506
+
507
+ SnapShotImage.Dispose()
508
+
509
+ End If
510
+
511
+
512
+
513
+ ' TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下の Finalize() をオーバーライドします。
514
+
515
+ ' TODO: 大きなフィールドを null に設定します。
516
+
517
+ End If
518
+
519
+ disposedValue = True
520
+
521
+ End Sub
522
+
523
+
524
+
525
+ ' TODO: 上の Dispose(disposing As Boolean) にアンマネージド リソースを解放するコードが含まれる場合にのみ Finalize() をオーバーライドします。
526
+
527
+ Protected Overrides Sub Finalize()
528
+
529
+ ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
530
+
531
+ Dispose(False)
532
+
533
+ MyBase.Finalize()
534
+
535
+ End Sub
536
+
537
+
538
+
539
+ ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
540
+
541
+ Public Sub Dispose() Implements IDisposable.Dispose
542
+
543
+ ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
544
+
545
+ Dispose(True)
546
+
547
+ ' TODO: 上の Finalize() がオーバーライドされている場合は、次の行のコメントを解除してください。
548
+
549
+ GC.SuppressFinalize(Me)
550
+
551
+ End Sub
552
+
553
+ #End Region
554
+
555
+
556
+
557
+ End Class
558
+
559
+ ```
560
+
561
+
562
+
563
+ ```VB
564
+
265
565
  Private Sub SaveShotImage()
266
566
 
267
567
  Dim saveDir As String
@@ -294,24 +594,14 @@
294
594
 
295
595
  Using image As New Bitmap(data.SnapShotImage)
296
596
 
297
- image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
597
+ image.Save(savePath, Config.ImageFormat) ' ここで落ちる
598
+
599
+ image.Dispose()
600
+
601
+ data.Dispose()
298
602
 
299
603
  End Using
300
604
 
301
- 'ちなみに以下もダメでした。
302
-
303
- 'Using tempImage As New Bitmap(data.SnapShotImage)
304
-
305
- ' data.SnapShotImage.Dispose()
306
-
307
- ' data.SnapShotImage = tempImage
308
-
309
- ' data.SnapShotImage.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
310
-
311
- 'End Using
312
-
313
-
314
-
315
605
  Catch ex As Exception
316
606
 
317
607
  Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
@@ -327,77 +617,3 @@
327
617
  End Sub
328
618
 
329
619
  ```
330
-
331
-
332
-
333
- テストとしてFor Eachの前で出力する
334
-
335
- `(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
336
-
337
- とするとうまくいきます。For Eachで何かまずいことが起きているのでしょうか?
338
-
339
-
340
-
341
- 以下でもダメでした。
342
-
343
- ```VB
344
-
345
- Private Sub SaveShotImage()
346
-
347
- Dim saveDir As String
348
-
349
- Dim savePath As String
350
-
351
- For Each data As DataDto In DataDtoList
352
-
353
- If data.SnapShotImage Is Nothing Then Continue For
354
-
355
-
356
-
357
- Try
358
-
359
- saveDir = System.IO.Path.Combine("C:\Users\MYNAME\Desktop", Strings.Format(Now, "yyyyMMdd"))
360
-
361
- If Not System.IO.Directory.Exists(saveDir) Then System.IO.Directory.CreateDirectory(saveDir)
362
-
363
-
364
-
365
- Do
366
-
367
- savePath = System.IO.Path.Combine(saveDir, Strings.Format(Now, "yyMMddHHmmss") & ".jpg")
368
-
369
- If Not System.IO.File.Exists(savePath) Then Exit Do
370
-
371
- Loop
372
-
373
-
374
-
375
- Using image As New Bitmap(data.SnapShotImage)
376
-
377
- image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
378
-
379
- If Not image Is Nothing Then image.Dispose()
380
-
381
- If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
382
-
383
- End Using
384
-
385
-
386
-
387
- Catch ex As Exception
388
-
389
- If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
390
-
391
- Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
392
-
393
- End Try
394
-
395
-
396
-
397
- data.ImageFilePath = savePath
398
-
399
- Next
400
-
401
- End Sub
402
-
403
- ```

6

誤字修正。

2019/01/22 09:50

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -306,7 +306,7 @@
306
306
 
307
307
  ' data.SnapShotImage = tempImage
308
308
 
309
- ' data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
309
+ ' data.SnapShotImage.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
310
310
 
311
311
  'End Using
312
312
 
@@ -374,7 +374,7 @@
374
374
 
375
375
  Using image As New Bitmap(data.SnapShotImage)
376
376
 
377
- data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
377
+ image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
378
378
 
379
379
  If Not image Is Nothing Then image.Dispose()
380
380
 

5

やってみたことを追記

2019/01/22 05:54

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -335,3 +335,69 @@
335
335
  `(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
336
336
 
337
337
  とするとうまくいきます。For Eachで何かまずいことが起きているのでしょうか?
338
+
339
+
340
+
341
+ 以下でもダメでした。
342
+
343
+ ```VB
344
+
345
+ Private Sub SaveShotImage()
346
+
347
+ Dim saveDir As String
348
+
349
+ Dim savePath As String
350
+
351
+ For Each data As DataDto In DataDtoList
352
+
353
+ If data.SnapShotImage Is Nothing Then Continue For
354
+
355
+
356
+
357
+ Try
358
+
359
+ saveDir = System.IO.Path.Combine("C:\Users\MYNAME\Desktop", Strings.Format(Now, "yyyyMMdd"))
360
+
361
+ If Not System.IO.Directory.Exists(saveDir) Then System.IO.Directory.CreateDirectory(saveDir)
362
+
363
+
364
+
365
+ Do
366
+
367
+ savePath = System.IO.Path.Combine(saveDir, Strings.Format(Now, "yyMMddHHmmss") & ".jpg")
368
+
369
+ If Not System.IO.File.Exists(savePath) Then Exit Do
370
+
371
+ Loop
372
+
373
+
374
+
375
+ Using image As New Bitmap(data.SnapShotImage)
376
+
377
+ data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
378
+
379
+ If Not image Is Nothing Then image.Dispose()
380
+
381
+ If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
382
+
383
+ End Using
384
+
385
+
386
+
387
+ Catch ex As Exception
388
+
389
+ If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
390
+
391
+ Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
392
+
393
+ End Try
394
+
395
+
396
+
397
+ data.ImageFilePath = savePath
398
+
399
+ Next
400
+
401
+ End Sub
402
+
403
+ ```

4

判明したことを追記

2019/01/22 05:44

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -298,6 +298,18 @@
298
298
 
299
299
  End Using
300
300
 
301
+ 'ちなみに以下もダメでした。
302
+
303
+ 'Using tempImage As New Bitmap(data.SnapShotImage)
304
+
305
+ ' data.SnapShotImage.Dispose()
306
+
307
+ ' data.SnapShotImage = tempImage
308
+
309
+ ' data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
310
+
311
+ 'End Using
312
+
301
313
 
302
314
 
303
315
  Catch ex As Exception

3

判明したことを追記

2019/01/21 09:17

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
 
79
- data.SnapShotImage.Save(savePath, ImageFormat.Jpeg) 'ここで落ちる
79
+ data.SnapShotImage.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
80
80
 
81
81
  Catch ex As Exception
82
82
 
@@ -294,7 +294,7 @@
294
294
 
295
295
  Using image As New Bitmap(data.SnapShotImage)
296
296
 
297
- image.Save(savePath, Config.ImageFormat) 'ここで落ちる
297
+ image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
298
298
 
299
299
  End Using
300
300
 
@@ -315,3 +315,11 @@
315
315
  End Sub
316
316
 
317
317
  ```
318
+
319
+
320
+
321
+ テストとしてFor Eachの前で出力する
322
+
323
+ `(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
324
+
325
+ とするとうまくいきます。For Eachで何かまずいことが起きているのでしょうか?

2

やってみたことを追記

2019/01/21 09:15

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -253,3 +253,65 @@
253
253
 
254
254
 
255
255
  どうぞよろしくお願いいたします。
256
+
257
+
258
+
259
+ ### 追記
260
+
261
+ 以下でもダメでした。
262
+
263
+ ```VB
264
+
265
+ Private Sub SaveShotImage()
266
+
267
+ Dim saveDir As String
268
+
269
+ Dim savePath As String
270
+
271
+ For Each data As DataDto In DataDtoList
272
+
273
+ If data.SnapShotImage Is Nothing Then Continue For
274
+
275
+
276
+
277
+ Try
278
+
279
+ saveDir = System.IO.Path.Combine("C:\Users\MYNAME\Desktop", Strings.Format(Now, "yyyyMMdd"))
280
+
281
+ If Not System.IO.Directory.Exists(saveDir) Then System.IO.Directory.CreateDirectory(saveDir)
282
+
283
+
284
+
285
+ Do
286
+
287
+ savePath = System.IO.Path.Combine(saveDir, Strings.Format(Now, "yyMMddHHmmss") & ".jpg")
288
+
289
+ If Not System.IO.File.Exists(savePath) Then Exit Do
290
+
291
+ Loop
292
+
293
+
294
+
295
+ Using image As New Bitmap(data.SnapShotImage)
296
+
297
+ image.Save(savePath, Config.ImageFormat) 'ここで落ちる
298
+
299
+ End Using
300
+
301
+
302
+
303
+ Catch ex As Exception
304
+
305
+ Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
306
+
307
+ End Try
308
+
309
+
310
+
311
+ data.ImageFilePath = savePath
312
+
313
+ Next
314
+
315
+ End Sub
316
+
317
+ ```

1

エラーメッセージ追記

2019/01/21 06:47

投稿

heart_crimson
heart_crimson

スコア15

test CHANGED
File without changes
test CHANGED
@@ -26,6 +26,14 @@
26
26
 
27
27
  GDI+ で一般的なエラーが発生しました
28
28
 
29
+
30
+
31
+ 場所 System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
32
+
33
+ 場所 System.Drawing.Image.Save(String filename, ImageFormat format)
34
+
35
+ 場所 ***.SaveShotImage() 場所 ***.vb:行 664
36
+
29
37
  ```
30
38
 
31
39
 
@@ -38,8 +46,6 @@
38
46
 
39
47
  ```VB
40
48
 
41
-
42
-
43
49
  Private Sub SaveShotImage()
44
50
 
45
51
  Dim saveDir As String
@@ -86,8 +92,6 @@
86
92
 
87
93
  End Sub
88
94
 
89
-
90
-
91
95
  ```
92
96
 
93
97
 
@@ -220,8 +224,6 @@
220
224
 
221
225
  End Namespace
222
226
 
223
-
224
-
225
227
  ```
226
228
 
227
229