tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: 繰り返しJpeg保存時にGDI+汎用エラー
投稿日: 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。