2011-01-04 34 views
10

私はさまざまなビットマップとアイコンのためのpng形式のまたは生のバイナリデータを表現できるデータベースからいくつかのblobデータを読み込むアプリケーションを持っています。これは格納されているstd::vector<unsigned char>メモリバッファからHBITMAPを作成する

私はCImageListオブジェクトを使用しています。ツリービュー、ツールバーイメージなどでさまざまなイメージを表示していますが、メモリ内のデータからビットマップを作成すると、今、私は単に一時的なファイルへのベクトルで)(データを書き込み、その後にそれをリードバックするためにLoadImageを使用して、そこからHBITMAPを作成していますこの問題を回避するには

std::vector<unsigned char> bits; 
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data()); 

:以下のようなものをやって。これは完全には動作しますが、それは間違いなく恥知らずのハックです。

私はオンラインで見てきましたが、メモリからhbitmapを「適切に」作成する方法の本当に良い例は見つかりませんでした。これらのビットマップを作成してファイルI/Oなしでイメージリストに追加し、可能であればデータをコピーする量を制限したいと考えています。

これを行うための最善の方法を探していて、明らかにウィンドウズ固有のコードは問題ありません。

UPDATE:JDVの答えに基づいて

私はCreateCompatibleBitmap、CreateDIBitmap、そして最終的にCreateDIBSectionで遊んで始まりました。これらのすべてが以前のファジービットマップの代わりに素敵な黒のビットマップを作成してしまったので、私はもう一度何か間違ったことをしているに違いない。このビットマップの作成は画面dcやウィンドウの概念がないオブジェクトで行われているので、GetDC(NULL)CreateCompatibleDC(NULL)は良いです。サンプルコード:私は今、もちろん完全HBITMAPを避け、CBitmapクラスを直接操作することにより、おそらくこれについて移動する簡単な方法があるように持っている考えています

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); 

?イメージをCImageListに追加することになると、とにかくCBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)を使用しています。誰もstd::vector<unsigned char>からCBitmapオブジェクトを初期化する簡単な方法を知っていますか?

+0

ごとに変更新しい意味に質問を編集しないでください。新しい質問を投稿して古い質問にリンクしてください。 –

+0

申し訳ありませんが、私はGDIの土地に入っていた唯一の理由は、私がCImageListに追加するときにFromHandleメソッドを使用していたことに気付いた... MFC CBitmapは単にGDI呼び出しをラップします。 – AJG85

答えて

3

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

+1

'Gdiplus :: Bitmap *'からHBITMAPを取得するには? –

5

CreateCompatibleBitmapを使用し、SetDIBitsと入力してデータを入力します。これらは私が動作することがわかっている関数であり、SetDIBitsは非常に柔軟ですが、冗長です。

私のMFCでは、パフォーマンスの問題が疑われてCreateBitmapが避けられました。

+1

私は基本的にはDC互換ビットマップを作成し、次にCBM_INITフラグを指定するとSetDIBitsを呼び出すCreateDIBitmapを見ています。誰でも、Windows APIの構造体のパラメータとメンバを命名したものを撮影する必要があります。 – AJG85

+0

まあ、CreateDIBitmapもありました。 –

関連する問題