質問編集履歴
7
やってみたことを追記
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
|
-
|
133
|
+
Imports System.Drawing
|
135
|
-
Dim savePath As String
|
136
|
-
|
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
|
-
|
160
|
+
Dim bmpsz As Integer = 0
|
141
|
-
|
161
|
+
mSmp.GetCurrentBuffer(bmpsz, IntPtr.Zero)
|
142
162
|
|
143
|
-
Do
|
144
|
-
|
163
|
+
'画像取得領域確保
|
145
|
-
|
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
|
-
'
|
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("
|
179
|
+
Throw New Exception("スナップショットに失敗しました。" & " : " & ex.Message, ex)
|
160
180
|
End Try
|
161
|
-
|
162
|
-
data.ImageFilePath = savePath
|
163
|
-
Next
|
164
|
-
|
181
|
+
End Function
|
165
182
|
```
|
166
183
|
|
184
|
+
### 追記2
|
167
|
-
|
185
|
+
色々調べてIDisposable実装してみました……。
|
168
|
-
`(DataDtoList(0).SnapShotImage.Save("C:\Users\MYNAME\Desktop\test.jpg", Imaging.ImageFormat.Jpeg)`
|
169
|
-
|
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,
|
299
|
+
image.Save(savePath, Config.ImageFormat) ' ここで落ちる
|
190
|
-
|
300
|
+
image.Dispose()
|
191
|
-
|
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
誤字修正。
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,
|
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
|
-
|
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
やってみたことを追記
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
判明したことを追記
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
判明したことを追記
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,
|
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
やってみたことを追記
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
エラーメッセージ追記
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
|
他にこういった個所のコードを開示してほしい等ありましたら随時開示いたします。
|