タイトル | : Re^4: 繰り返しJpeg保存時にGDI+汎用エラー |
記事No | : 11432 |
投稿日 | : 2015/05/25(Mon) 20:06 |
投稿者 | : Kobaちゃん |
指摘頂いた項目を盛り込んで再トライしてみます。
> 上記の場合はどこで、解放していますか? 解放していませんでしたので追加しました。
If i >= 100 Then '100回チェックしてもファイルサイズが3000byteより小さければ読出しエラー GetCamCap = "Cam Img保存失敗" bmp.Dispose() <- 追加しました bmp = Nothing Exit Function End If
> 上記場合の解放しょりは? 紹介頂いたURLを参照して追加しました。 画像差替え前のPictureBox.Imageプロパティ値をDisposeする必要があるのを知りませんでした。 アドバイスありがとうございました。
picCamImg.SizeMode = PictureBoxSizeMode.AutoSize 'BitmapをPictureBoxに表示 Dim ImgOld As Bitmap = picCamImg.Image <- 差替え前のImageプロパティを取得 picCamImg.Load(pstrLogImgDir & "\" & strBmpFile) If ImgOld IsNot Nothing Then ImgOld.Dispose() <- 差替え前のImageプロパティをDispose ImgOld = Nothing End If
> 又、下記のような処理も好ましくありません、どのような問題が発生するかわかりません。 > > Threading.Thread.Sleep(50) > > Application.DoEvents() MsgWaitForMultipleObjectsを使ったタイマーに変更します
> コードを投稿して頂くならこま切れのようなコードでなく事象の再現できるコードを投稿してください。 上記修正を加えて、下記コードで再トレイしています。長いコードですみません。
<GDI+エラーが発生するコード> 'カメラ画像取得と保存 Private Function GetCamCap(ByVal strUrl As String, ByVal strBmpFile As String) As String Dim i As Integer Const DEF_WEB_W As Long = 54 '初期WebBrowser幅 Const DEF_WEB_H As Long = 44 '初期WebBrowser高さ Const WEB_UP_LIM As Long = 1000 'WebBrowser更新待ち
On Error GoTo ErrExit
pblnWebUpdate = False Me.webCam.Width = DEF_WEB_W Me.webCam.Height = DEF_WEB_H Me.webCam.Navigate(strUrl) 'カメラから画像を取得 lblMsg.Visible = True Call WaitTim(20)
For i = 1 To WEB_UP_LIM lblMsg.Text = "画像取得中 " & i.ToString & " / " & WEB_UP_LIM.ToString If pblnWebUpdate = True Then Exit For Call WaitTim(20) Me.Refresh() Next lblMsg.Visible = False If i >= WEB_UP_LIM Then GetCamCap = "NG(Web取得失敗)" Exit Function End If
'WebBrowserのサイズに合わせてBitmap生成 webCam.Width = webCam.Document.Body.ScrollRectangle.Width 'WebBrowser横サイズあわせ webCam.Height = webCam.Document.Body.ScrollRectangle.Height 'WebBrowser縦サイズあわせ
Dim bmp As New Bitmap(webCam.Width, webCam.Height) Dim gra As Graphics = Graphics.FromImage(bmp) 'BitmapのGraphicsを取得 Dim hdc As IntPtr = gra.GetHdc 'BitmapのGraphicsのHdcを取得 Dim web As IntPtr = _ System.Runtime.InteropServices.Marshal.GetIUnknownForObject( _ webCam.ActiveXInstance) 'WebBrowser(WEBページ)のオブジェクト取得
Dim rect As Rectangle = New Rectangle(0, 0, bmp.Width, bmp.Height) OleDraw(web, pDVASPECT_CONTENT, hdc, rect) 'WebBrowserイメージをBitmapにコピー System.Runtime.InteropServices.Marshal.Release(web) 'WebBrowserのオブジェクト使用終了 gra.Dispose() ' BitmapのGraphicsの使用終了
'Bitmapをjpg形式で保存() bmp.Save(pstrLogImgDir & "\" & strBmpFile, System.Drawing.Imaging.ImageFormat.Jpeg) bmp.Dispose() bmp = Nothing
Dim fs As New FileInfo(pstrLogImgDir & "\" & strBmpFile) For i = 1 To 100 If fs.Length >= Val(txtImgFileSize.Text) Then Exit For Call WaitTim(50) '50msecタイマー(10msec単位でDoEvents実行) Next If i >= 100 Then GetCamCap = "Cam Img保存失敗" bmp.Dispose() bmp = Nothing Exit Function End If
picCamImg.SizeMode = PictureBoxSizeMode.AutoSize 'BitmapをPictureBoxに表示 Dim ImgOld As Bitmap = picCamImg.Image picCamImg.Load(pstrLogImgDir & "\" & strBmpFile) If ImgOld IsNot Nothing Then ImgOld.Dispose() ImgOld = Nothing End If
GetCamCap = "OK" Call WaitTim(gWAIT_TIM) 'Waitタイマー Exit Function
ErrExit: GetCamCap = "NG(" & Err.Description & ")" If InStr(GetCamCap, "GDI+") <> 0 Then MsgBox("GDI+ で汎用エラーが発生しました。", MsgBoxStyle.Exclamation) End If If bmp IsNot Nothing Then bmp.Dispose() bmp = Nothing End If If ImgOld IsNot Nothing Then ImgOld.Dispose() ImgOld = Nothing End If
End Function
|