Microsoft VC++6.0 で、画像を表示するアプリケーションを作っていて、GDI+ で様々な画像を呼び出せるようにしています。
Gdiplus::Bitmap* pGdiBitmap = Gdiplus::Bitmap::FromFile( ファイル名 ) ;
で呼び出し、
HBITMAP hBitmap ;
pGdiBitmap->GetHBITMAP(color , hBitmap)
によりHBITMAPを取得し、
CBitmap* pBitmap
をクラス内に用意し、BitBlt() 関数で画像データを pBitmap にコピーし、その後
delete pGdiBitmap
で削除しています。CBitmap* pBitmap にデータを保持していればいいので。
しかし、ファイルを「開く→閉じる」を繰り返し20回や30回行うと、画像を読み込めなくなりました。
最初に調べたのが、
「pGdiBitmap を読み込んだ後に pGdiBitmap->GetHBITMAP() を実行すると戻り値が、
OutOfMemory = 3」
でした。
そこで、タスクマネージャでメモリを見ながら画像を何度も開くと、開いた画像を閉じてもメモリはそんぽままで、画像を開く度にメモリが増え、150Mとかになって、メモリ不足になることがわかりました。
これは、delete pGdiBitmap ではダメと言うことですか?それとも、プログラムがおかしいでしょうか。
Windows7 , Microsoft VC++6.0 Professional Edition , (Microsoft Platform SDK)
class CMyPicture
{
public
(コンストラクタなど)
void LoadPicture(LPCTSTR lpszFilename);
protected:
CBitmap* m_pBitmap ;
}
void CMyPicture::LoadPicture(LPCTSTR lpszFilename)
{
HBITMAP hBitmap ;
WCHAR wPath[MAX_PATH] ;
※ファイル名 lpszFilename をMultiByteToWideChar()で変換済み
Gdiplus::Bitmap* pGdiBitmap = Bitmap::FromFile(wPath , TRUE) ;
Status r = pGdiBitmap->GetHBITMAP( Color(0,0,0,0) , &hBitmap) ;
※ CDC dcMemory などを用意してBitBlt()で hBitmap から(CBitmap*)m_pBitmap に転送
delete pGdiBitmap ;
}
こんな感じです。
画像を開いて表示すること自体は成功していますが、画像を閉じてもメモリをどんどん使ってしまいます。
根本的に何か間違っていますか?GDI+をVC++6.0で使っていては限界なのでしょうか。
どなたか、教えていただけると助かります。
No.1ベストアンサー
- 回答日時:
> CDC dcMemory などを用意してBitBlt()で hBitmap から(CBitmap*)m_pBitmap に転送
ここで確保したメモリーを、解放してますか?
あるいは
使い回すはずのメモリーを、画像を開く度に毎回確保してませんか?
あと、pGdiBitmap->GetHBITMAP のあとで、ReleaseDCが無いようですが。
この回答への補足
ありがとうございます。
全て確保したメモリーの解放は行っています。
・デバイスコンテキストも解放しています。
・CBitmap* m_pBitmap = new CBitmap ; は delete m_pBitmap ;で解放
GDI+ さえ使っていなければ、メモリリークは一切ないので、やはりGDI+ で何かメモリが解放されていないようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- フリーソフト 倍率自動調整して全画面表示できるフリーの画像ビューアー 1 2023/08/24 10:55
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
- その他(ブラウザ) IE・edgeで日増しに観られるサイトが減ってくる。 1 2022/10/04 22:40
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Yahoo!メール Aliexpressから送られてくる画像メールの画像が表示されない 1 2022/05/30 09:10
- Windows 10 フォルダ内の全ての画像を矢印キーでスライドできるようにしたい 1 2022/10/21 12:53
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLです。画像をHTMLで表した...
-
jqueryスライダーを2段でスライ...
-
HTMLでこの画像を表示したいで...
-
【EXCEL VBA】ダブルクリックで...
-
bmp形式の画像を色の深さを24ビ...
-
画像処理したBitmapをピクチャ...
-
ローカルで動くページがサーバ...
-
「using Windows」でエラーが出る
-
C# Picturebox 縮小・拡大時の...
-
uwsc画像認識のあいまい判定に...
-
EXCEL VBA 複数のImageコントロ...
-
画像のランダム表示
-
VC++6.0でGDI+利用してメモリリ...
-
vb.net 画像の透過について
-
背景画像の繰り返しについて
-
モーダルウィンドウ内で複数の...
-
スマホでサイトの画像を長押し→...
-
gif 画像上の ボタンに リン...
-
マスク画像の自動作成
-
uwscの画像認識に失敗します。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【EXCEL VBA】ダブルクリックで...
-
背景画像の繰り返しについて
-
EXCEL VBA 複数のImageコントロ...
-
「using Windows」でエラーが出る
-
jqueryスライダーを2段でスライ...
-
画像のピクセルデータの取得
-
ImageMagickでgif画像の一部が...
-
Excel ユーザーフォームで表示...
-
uwcs のマクロで画像認識をして...
-
uwscの画像認識に失敗します。
-
vb.net 画像の透過について
-
VBA シート毎に画像挿入
-
UWSC 画像判定と条件分岐について
-
UWSC「画像が無い場合」
-
gif 画像上の ボタンに リン...
-
Pythonでgif画像が上手く作れない
-
VBAのユーザーフォームのイメー...
-
UWSC 画像認識で条件分岐
-
パネルに画像
-
【WPF】画像の切り替え
おすすめ情報