さまざまなビットマップやアイコンのpng形式または生のバイナリデータを表すことができるデータベースからいくつかのblobデータをロードするアプリケーションがあります。これはに保存されていますstd::vector<unsigned char>
オブジェクトを使用CImageList
してツリービューやツールバー画像などにさまざまな画像を表示していますが、問題は、メモリ内のデータからビットマップを作成すると、次のような操作を行うとピクセルが欠落しているようにぼやけてしまうことです。
std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());
今のところこの問題を回避するために、ベクター内のdata()を一時ファイルに書き出し、LoadImageを使用してそれを読み戻し、そこからHBITMAPを作成しています。これは完全に機能しますが、それは確かに恥知らずなハックであり、私が望むのは完全に不要なはずです。
私はオンラインで調べましたが、メモリからhbitmapを「適切に」作成する方法の本当に良い例は見つかりませんでした。これらのビットマップを作成して、ファイルI / Oを使用せずに、可能であればデータを限られた量だけコピーして、画像リストに追加できるようにしたいと思います。
これを行うための最良の方法を探しており、明らかにWindows固有のコードで問題ありません。
アップデート:
jdvの回答に基づいて、CreateCompatibleBitmap、CreateDIBitmap、そして最後にCreateDIBSectionで遊び始めました。これらはすべて、以前のファジービットマップの代わりに素敵な黒いビットマップを作成することになったので、もう一度何か間違ったことをしなければなりません。このビットマップの作成は、スクリーンDCまたはウィンドウの概念を持たないオブジェクトで行われているためです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
からオブジェクトを初期化する簡単な方法を知っていstd::vector<unsigned char>
ますか?