teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

やってみたことを追記

2019/01/22 09:51

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -127,49 +127,159 @@
127
127
 
128
128
  どうぞよろしくお願いいたします。
129
129
 
130
- ### 追記
130
+ ### 追記1
131
- 以下でもダメでした
131
+ ラの実装部分
132
132
  ```VB
133
- Private Sub SaveShotImage()
134
- Dim saveDir As String
133
+ Imports System.Drawing
135
- Dim savePath As String
136
- For Each data As DataDto In DataDtoList
134
+ Imports System.Runtime.InteropServices
137
- If data.SnapShotImage Is Nothing Then Continue For
138
135
 
136
+ #Region "Private変数"
137
+
138
+ Private mGrp As IGraphBuilder 'グラフ
139
+ Private mFlt As IBaseFilter 'キャプチャフィルタ
140
+ Private mPin As IPin 'キャプチャフィルタの出力ピン
141
+ Private mSmp As ISampleGrabber 'サンプルグラバフィルタ
142
+
143
+ Private mSize As Size '映像サイズ
144
+ Private mBuff As IntPtr 'ビットマップ取得用バッファ
145
+
146
+ Private mFmt As PIXELFORMATYPE 'ピクセル形式
147
+
148
+ Private mVisible As Boolean 'カメラ映像を表示するか?
149
+
150
+ #End Region
151
+
152
+ '----一部省略----
153
+
154
+ Public Function snapShot() As Bitmap
155
+ If mGrp Is Nothing Or mSmp Is Nothing Then Throw New Exception("キャプチャーが取得できません。")
156
+
157
+ 'イメージの取得
139
158
  Try
159
+ '画像データサイズ取得
140
- saveDir = System.IO.Path.Combine("C:\Users\MYNAME\Desktop", Strings.Format(Now, "yyyyMMdd"))
160
+ Dim bmpsz As Integer = 0
141
- If Not System.IO.Directory.Exists(saveDir) Then System.IO.Directory.CreateDirectory(saveDir)
161
+ mSmp.GetCurrentBuffer(bmpsz, IntPtr.Zero)
142
162
 
143
- Do
144
- savePath = System.IO.Path.Combine(saveDir, Strings.Format(Now, "yyMMddHHmmss") & ".jpg")
163
+ '画像取得領域確保
145
- If Not System.IO.File.Exists(savePath) Then Exit Do
164
+ Dim bmpptr As IntPtr = Marshal.AllocHGlobal(bmpsz)
146
- Loop
147
165
 
148
- Using image As New Bitmap(data.SnapShotImage)
149
- image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
150
- End Using
151
- 'ちなみに以下もダメでした。
152
- 'Using tempImage As New Bitmap(data.SnapShotImage)
153
- ' data.SnapShotImage.Dispose()
154
- ' data.SnapShotImage = tempImage
155
- ' data.SnapShotImage.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
156
- 'End Using
166
+ 'イメージ取得
167
+ mSmp.GetCurrentBuffer(bmpsz, bmpptr)
157
168
 
169
+ '画像サイズを取得
170
+ Dim vsz As Size
171
+ vsz = GetVideoSize(mGrp)
172
+ '描画
173
+ Dim bmpdata As Bitmap
174
+ bmpdata = New Bitmap(vsz.Width, vsz.Height, vsz.Width * 3, Imaging.PixelFormat.Format24bppRgb, bmpptr)
175
+ bmpdata.RotateFlip(RotateFlipType.RotateNoneFlipY) '上下反転させる
176
+
177
+ snapShot = bmpdata
158
178
  Catch ex As Exception
159
- Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
179
+ Throw New Exception("スナップショットに失敗しました。" & " : " & ex.Message, ex)
160
180
  End Try
161
-
162
- data.ImageFilePath = savePath
163
- Next
164
- End Sub
181
+ End Function
165
182
  ```
166
183
 
184
+ ### 追記2
167
- テストとしてFor Eachの前で出力する
185
+ 色々調べてIDisposable実装してみました……。
168
- `(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
169
- とするとうまくいきます。For Each何かまずいことているのでしょうか?
186
+ これでうまく動くのが一番理想まだ動ません……。
170
187
 
171
- 以下でもダメでした。
188
+ DataDto.vb
172
189
  ```VB
190
+ Public Class DataDto
191
+ Implements IDisposable
192
+
193
+ #Region "プロパティ"
194
+
195
+ ''' <summary>画像ファイルパス</summary>
196
+ Public Property ImageFilePath As String
197
+
198
+ ''' <summary>画像格納用(スナップショット格納用)</summary>
199
+ Public Property SnapShotImage As System.Drawing.Image = Nothing
200
+
201
+ #End Region
202
+
203
+ #Region "メソッド"
204
+
205
+ ''' <summary>
206
+ ''' データをコピーする
207
+ ''' </summary>
208
+ ''' <param name="target">コピー先対象</param>
209
+ ''' <remarks></remarks>
210
+ Public Sub CopyData(ByRef target As DataDto)
211
+ target.ImageFilePath = ImageFilePath
212
+ target.SnapShotImage = SnapShotImage?.Clone
213
+ End Sub
214
+
215
+ ''' <summary>
216
+ ''' データをクリアにする
217
+ ''' </summary>
218
+ ''' <remarks></remarks>
219
+ Public Sub Clear()
220
+ ImageFilePath = Nothing
221
+ SnapShotImage = Nothing
222
+ End Sub
223
+
224
+ ''' <summary>
225
+ ''' 同一データの作成(別インスタンス)
226
+ ''' </summary>
227
+ ''' <remarks></remarks>
228
+ Public Function Clone() As DataDto
229
+ Dim dto As New DataDto With {
230
+ .ImageFilePath = ImageFilePath,
231
+ .SnapShotImage = SnapShotImage?.Clone
232
+ }
233
+
234
+ Return dto
235
+ End Function
236
+
237
+ #End Region
238
+
239
+ #Region "コンストラクタ"
240
+
241
+ Public Sub New()
242
+ Me.Clear()
243
+ End Sub
244
+
245
+ #End Region
246
+
247
+ #Region "IDisposable Support"
248
+ Private disposedValue As Boolean ' 重複する呼び出しを検出するには
249
+
250
+ ' IDisposable
251
+ Protected Overridable Sub Dispose(disposing As Boolean)
252
+ If Not disposedValue Then
253
+ If disposing Then
254
+ SnapShotImage.Dispose()
255
+ End If
256
+
257
+ ' TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下の Finalize() をオーバーライドします。
258
+ ' TODO: 大きなフィールドを null に設定します。
259
+ End If
260
+ disposedValue = True
261
+ End Sub
262
+
263
+ ' TODO: 上の Dispose(disposing As Boolean) にアンマネージド リソースを解放するコードが含まれる場合にのみ Finalize() をオーバーライドします。
264
+ Protected Overrides Sub Finalize()
265
+ ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
266
+ Dispose(False)
267
+ MyBase.Finalize()
268
+ End Sub
269
+
270
+ ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
271
+ Public Sub Dispose() Implements IDisposable.Dispose
272
+ ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
273
+ Dispose(True)
274
+ ' TODO: 上の Finalize() がオーバーライドされている場合は、次の行のコメントを解除してください。
275
+ GC.SuppressFinalize(Me)
276
+ End Sub
277
+ #End Region
278
+
279
+ End Class
280
+ ```
281
+
282
+ ```VB
173
283
  Private Sub SaveShotImage()
174
284
  Dim saveDir As String
175
285
  Dim savePath As String
@@ -186,13 +296,11 @@
186
296
  Loop
187
297
 
188
298
  Using image As New Bitmap(data.SnapShotImage)
189
- image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
299
+ image.Save(savePath, Config.ImageFormat) ' ここで落ちる
190
- If Not image Is Nothing Then image.Dispose()
300
+ image.Dispose()
191
- If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
301
+ data.Dispose()
192
302
  End Using
193
-
194
303
  Catch ex As Exception
195
- If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
196
304
  Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
197
305
  End Try
198
306
 

6

誤字修正。

2019/01/22 09:50

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -152,7 +152,7 @@
152
152
  'Using tempImage As New Bitmap(data.SnapShotImage)
153
153
  ' data.SnapShotImage.Dispose()
154
154
  ' data.SnapShotImage = tempImage
155
- ' data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
155
+ ' data.SnapShotImage.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
156
156
  'End Using
157
157
 
158
158
  Catch ex As Exception
@@ -186,7 +186,7 @@
186
186
  Loop
187
187
 
188
188
  Using image As New Bitmap(data.SnapShotImage)
189
- data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
189
+ image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
190
190
  If Not image Is Nothing Then image.Dispose()
191
191
  If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
192
192
  End Using

5

やってみたことを追記

2019/01/22 05:54

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -166,4 +166,37 @@
166
166
 
167
167
  テストとしてFor Eachの前で出力する
168
168
  `(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
169
- とするとうまくいきます。For Eachで何かまずいことが起きているのでしょうか?
169
+ とするとうまくいきます。For Eachで何かまずいことが起きているのでしょうか?
170
+
171
+ 以下でもダメでした。
172
+ ```VB
173
+ Private Sub SaveShotImage()
174
+ Dim saveDir As String
175
+ Dim savePath As String
176
+ For Each data As DataDto In DataDtoList
177
+ If data.SnapShotImage Is Nothing Then Continue For
178
+
179
+ Try
180
+ saveDir = System.IO.Path.Combine("C:\Users\MYNAME\Desktop", Strings.Format(Now, "yyyyMMdd"))
181
+ If Not System.IO.Directory.Exists(saveDir) Then System.IO.Directory.CreateDirectory(saveDir)
182
+
183
+ Do
184
+ savePath = System.IO.Path.Combine(saveDir, Strings.Format(Now, "yyMMddHHmmss") & ".jpg")
185
+ If Not System.IO.File.Exists(savePath) Then Exit Do
186
+ Loop
187
+
188
+ Using image As New Bitmap(data.SnapShotImage)
189
+ data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
190
+ If Not image Is Nothing Then image.Dispose()
191
+ If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
192
+ End Using
193
+
194
+ Catch ex As Exception
195
+ If Not data.SnapShotImage Is Nothing Then data.SnapShotImage.Dispose()
196
+ Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
197
+ End Try
198
+
199
+ data.ImageFilePath = savePath
200
+ Next
201
+ End Sub
202
+ ```

4

判明したことを追記

2019/01/22 05:44

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -148,6 +148,12 @@
148
148
  Using image As New Bitmap(data.SnapShotImage)
149
149
  image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
150
150
  End Using
151
+ 'ちなみに以下もダメでした。
152
+ 'Using tempImage As New Bitmap(data.SnapShotImage)
153
+ ' data.SnapShotImage.Dispose()
154
+ ' data.SnapShotImage = tempImage
155
+ ' data.SnapShotImage.Save(savePath, Config.ImageFormat) 'ここで落ちる
156
+ 'End Using
151
157
 
152
158
  Catch ex As Exception
153
159
  Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)

3

判明したことを追記

2019/01/21 09:17

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -37,7 +37,7 @@
37
37
  If Not System.IO.File.Exists(savePath) Then Exit Do
38
38
  Loop
39
39
 
40
- data.SnapShotImage.Save(savePath, ImageFormat.Jpeg) 'ここで落ちる
40
+ data.SnapShotImage.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
41
41
  Catch ex As Exception
42
42
  Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
43
43
  End Try
@@ -146,7 +146,7 @@
146
146
  Loop
147
147
 
148
148
  Using image As New Bitmap(data.SnapShotImage)
149
- image.Save(savePath, Config.ImageFormat) 'ここで落ちる
149
+ image.Save(savePath, Imaging.ImageFormat.Jpeg) 'ここで落ちる
150
150
  End Using
151
151
 
152
152
  Catch ex As Exception
@@ -156,4 +156,8 @@
156
156
  data.ImageFilePath = savePath
157
157
  Next
158
158
  End Sub
159
- ```
159
+ ```
160
+
161
+ テストとしてFor Eachの前で出力する
162
+ `(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
163
+ とするとうまくいきます。For Eachで何かまずいことが起きているのでしょうか?

2

やってみたことを追記

2019/01/21 09:15

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -125,4 +125,35 @@
125
125
  VB 2012
126
126
  .NET Framework 4
127
127
 
128
- どうぞよろしくお願いいたします。
128
+ どうぞよろしくお願いいたします。
129
+
130
+ ### 追記
131
+ 以下でもダメでした。
132
+ ```VB
133
+ Private Sub SaveShotImage()
134
+ Dim saveDir As String
135
+ Dim savePath As String
136
+ For Each data As DataDto In DataDtoList
137
+ If data.SnapShotImage Is Nothing Then Continue For
138
+
139
+ Try
140
+ saveDir = System.IO.Path.Combine("C:\Users\MYNAME\Desktop", Strings.Format(Now, "yyyyMMdd"))
141
+ If Not System.IO.Directory.Exists(saveDir) Then System.IO.Directory.CreateDirectory(saveDir)
142
+
143
+ Do
144
+ savePath = System.IO.Path.Combine(saveDir, Strings.Format(Now, "yyMMddHHmmss") & ".jpg")
145
+ If Not System.IO.File.Exists(savePath) Then Exit Do
146
+ Loop
147
+
148
+ Using image As New Bitmap(data.SnapShotImage)
149
+ image.Save(savePath, Config.ImageFormat) 'ここで落ちる
150
+ End Using
151
+
152
+ Catch ex As Exception
153
+ Throw New Exception("画像保存に失敗しました。" & ex.Message, ex)
154
+ End Try
155
+
156
+ data.ImageFilePath = savePath
157
+ Next
158
+ End Sub
159
+ ```

1

エラーメッセージ追記

2019/01/21 06:47

投稿

heart_crimson
heart_crimson

スコア15

title CHANGED
File without changes
body CHANGED
@@ -12,13 +12,16 @@
12
12
 
13
13
  ```
14
14
  GDI+ で一般的なエラーが発生しました
15
+
16
+ 場所 System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
17
+ 場所 System.Drawing.Image.Save(String filename, ImageFormat format)
18
+ 場所 ***.SaveShotImage() 場所 ***.vb:行 664
15
19
  ```
16
20
 
17
21
  ### 該当のソースコード
18
22
 
19
23
  コード一部抜粋(保存先は本来コンフィグファイルで設定していますが、今は固定で入れています)
20
24
  ```VB
21
-
22
25
  Private Sub SaveShotImage()
23
26
  Dim saveDir As String
24
27
  Dim savePath As String
@@ -42,7 +45,6 @@
42
45
  data.ImageFilePath = savePath
43
46
  Next
44
47
  End Sub
45
-
46
48
  ```
47
49
 
48
50
  DataDto.vb
@@ -109,7 +111,6 @@
109
111
  End Class
110
112
 
111
113
  End Namespace
112
-
113
114
  ```
114
115
 
115
116
  他にこういった個所のコードを開示してほしい等ありましたら随時開示いたします。