メモリバッファからHBITMAPを作成します
質問
さまざまなビットマップやアイコンのPNGフォーマットまたは生のバイナリデータを表すことができるデータベースからBLOBデータをロードするアプリケーションがあります。これはaに保存されています std::vector<unsigned char>
私は使用しています CImageList
ツリービュー、ツールバー画像などにさまざまな画像を表示するオブジェクトですが、問題はメモリ内のデータからビットマップを作成することです。
std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());
今のところこの問題を回避するために、私は単にベクトル内のデータ()を一時ファイルに書き出してから、LoadImageを使用してそれを読み戻し、そこからHBITMAPを作成しています。これは完全に機能しますが、それは明らかに恥知らずなハックであり、私が望む完全に不必要なはずです。
私はオンラインで見回していますが、メモリからHBITMAPを「適切に」作成する方法の本当に良い例を見つけていません。これらのビットマップを作成して、ファイルi/oなしで画像リストに追加し、可能であればデータをコピーすることなく制限できるようにしたいと思います。
これを行うための最良の方法を探しており、明らかにWindows固有のコードは問題ありません。
アップデート:
JDVの回答に基づいて、CreateCompatibleBitMap、CreatedIbitMap、そして最終的にCreatedIbsectionで再生を開始しました。これらはすべて、以前のファジービットマップの代わりに素敵な黒いビットマップを作成することになったので、私は再び何か間違ったことをしている必要があります。 GetDC(NULL)
と CreateCompatibleDC(NULL)
良くありません。サンプルコード:
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biHeight = 16;
bmi.bmiHeader.biWidth = 16;
bmi.bmiHeader.biPlanes = 1;
HDC dc = CreateCompatibleDC(NULL);
HBITMAP hbitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void**)blobData.GetMember<FILEDATAFIELD_DATA>().data(), NULL, 0);
もちろん、Hbitmapを完全に避けて直接作業することで、これをより簡単に進める方法がある必要があると思います。 CBitmap
クラス?画像をに追加することになると CImageList
私は使用しています CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)
とりあえず。誰もが初期化する簡単な方法を知っていますか? CBitmap
aからのオブジェクト std::vector<unsigned char>
?
解決 2
Gdiplusを使用して、かなりうまく機能し、歯を引くことは含まれないものを手に入れました!
Gdiplus::Bitmap* pBitmap = NULL;
IStream* pStream = NULL;
HRESULT hResult = ::CreateStreamOnHGlobal( NULL, TRUE, &pStream );
if(hResult == S_OK && pStream)
{
hResult = pStream->Write(&bits[0], ULONG(bits.size()), NULL);
if(hResult == S_OK)
pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
}
編集: Jegatheeshごとに変更されました
他のヒント
私は使用します CreateCompatibleBitmap
, 、そして電話してください SetDIBits
データを入力します。これらは私が機能するように見た関数であり、setDibitsは冗長ですが、非常に柔軟です。
私のMFC年に、 CreateBitmap
パフォーマンスの問題が疑われるため、避けられました。