|
分類:[C#]
2011/10/23(Sun) 15:50:26 編集(投稿者) 2011/10/23(Sun) 15:50:14 編集(投稿者)
はじめまして^^
C#、C初心者のコウと申します。
C#、Cにて画像処理の開発をしております。 以下の処理を100ミリ秒などの間隔で繰返し処理をすると242回目で以下のエラーが発生致しました。 1回の実行では正常に動作するのですが、連続して何度も処理を実行した場合に発生するエラーです。 改善方法をご存知の方がいらっしゃいましたら、アドバイス頂けますと幸いです。 お手数をおかけ致しますが、宜しくお願い致します。
■処理 unsafe public bool LoadNumBmp() { bool bResult = true; //------------------------------------------------------------------------------ // ビットマップファイルからビット配列を取り出す //------------------------------------------------------------------------------ // --- ビットマップファイル数分ループ ----------------------------- for (int i = 0; i < _FineNames.Length; i++) { // ビットマップファイル読込 FileStream fs = File.OpenRead(_FineNames[i]); Image img = Image.FromStream(fs, false, false); _aSize[i].Width = img.Width; _aSize[i].Height = img.Height; // DIBバッファ生成 _aBmpBuf[i] = WinAPI.HeapAlloc(WinAPI.GetProcessHeap(), WinAPI.HEAP_ZERO_MEMORY, (UInt32)(img.Width * img.Height * 4)); WinAPI.BITMAPINFO bmpInfo; bmpInfo.bmiHeader.biSize = (UInt32)sizeof(WinAPI.BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = img.Width; bmpInfo.bmiHeader.biHeight = img.Height * -1; // 上下反転してない見た目通りにする bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 32; bmpInfo.bmiHeader.biCompression = WinAPI.BI_RGB; // Graphicsの作成 Graphics g = Graphics.FromImage(img); // Graphicsのデバイスコンテキストを取得 IntPtr hDC = g.GetHdc(); Bitmap bmp = (Bitmap)img; IntPtr hBitmap = bmp.GetHbitmap(); // DDB→DIB変換 int nLen = WinAPI.GetDIBits(hDC, hBitmap, 0, (UInt32)img.Height, _aBmpBuf[i], new IntPtr(&bmpInfo), WinAPI.DIB_RGB_COLORS); //解放 WinAPI.DeleteObject(hBitmap); g.ReleaseHdc(hDC); g.Dispose(); img.Dispose(); fs.Dispose(); bmp.Dispose(); } // --- RGB値以外の箇所を0埋め --------------------------------------- for (int nNum = 0; nNum < _NumCount; ++nNum) { UInt32* lpNum = (UInt32*)_aBmpBuf[nNum]; int y = 0; int numcy = _aSize[nNum].Height; int numcx = _aSize[nNum].Width; _aFirstNumPos[nNum].X = -1; _aFirstNumPos[nNum].Y = -1; // --- 最初に数値文字の位置 ------------------------------------- for (y = 0; y < numcy; ++y) { int x; for (x = 0; x < numcx; ++x) { UInt32 bmpBit = lpNum[x + y * numcx] & 0xFFFFFF; lpNum[x + y * numcx] = bmpBit; } } } return bResult; }
■エラー □エラー発生箇所 IntPtr hBitmap = bmp.GetHbitmap();
□エラー詳細 System.Runtime.InteropServices.ExternalException はハンドルされませんでした。 Message="GDI+ で汎用エラーが発生しました。" Source="System.Drawing" ErrorCode=-2147467259
|