Frage

Ich habe eine Anwendung, die einige Blob -Daten aus einer Datenbank lädt, die PNG -formatierte oder rohe Binärdaten für verschiedene Bitmaps und Symbole darstellen kann. Dies wird in einem gespeichert std::vector<unsigned char>

Ich benutze CImageList Objekte, um verschiedene Bilder in Baumansichten, Symbolleistenbildern usw. anzuzeigen, aber das Problem besteht darin, Bitmaps aus den Daten im Speicher zu erstellen, als ob es Pixel fehlen, wenn sie so etwas wie unten erledigen:

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

Um dieses Problem vorerst zu bearbeiten, schreibe ich einfach die Daten () im Vektor in eine temporäre Datei aus und verwende dann LoadImage, um sie wieder einzulesen und die Hbitmap daraus zu erstellen. Dies funktioniert jedoch perfekt, was zugegebenermaßen ein schamloser Hack ist und sollte völlig unnötig sein, ich würde hoffen.

Ich habe mich online umgesehen, habe aber keine wirklich guten Beispiele gefunden, wie man Hbitmaps aus dem Speicher "richtig" erstellt. Ich möchte in der Lage sein, diese Bitmaps zu erstellen, um der Bildliste ohne eine Datei -E/A und begrenzte Mengen des Kopierens der Daten nach Möglichkeit hinzugefügt werden.

Auf der Suche nach dem besten Weg, dies zu tun, und offensichtlich Windows -spezifischer Code ist in Ordnung.

AKTUALISIEREN:

Basierend auf JDVs Antwort begann ich mit CreateCompatibleBitMap, CreatedIBitMap zu spielen und schließlich zu erstellen. All dies hat letztendlich schöne schwarze Bitmaps anstelle der vorherigen Fuzzy -Bitmaps erstellt, also muss ich wieder etwas falsch machen und ich vermute, da diese Bitmap -Kreation in einem Objekt durchgeführt wird, das kein Konzept des Bildschirms DC oder Fenster verwendet, das verwendet GetDC(NULL) und CreateCompatibleDC(NULL) sind nicht gut. Beispielcode:

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

Ich denke jetzt natürlich, dass es einen einfacheren Weg geben muss, dies vielleicht zu erledigen, indem ich die HBitmap insges CBitmap Klasse? Wenn es darum geht, das Bild zum Hinzufügen zu dem Hinzufügen CImageList Ich benutze CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask) ohnehin. Kennt jemand eine einfache Möglichkeit, a zu initialisieren? CBitmap Objekt von a std::vector<unsigned char>?

War es hilfreich?

Lösung 2

Mit Gdiplus habe ich etwas, das ziemlich gut funktioniert und nicht das Ziehen von Zähnen beinhaltet!

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

Bearbeiten: Pro Jegatheesh geändert

Andere Tipps

Ich würde benutzen CreateCompatibleBitmap, und dann rufen Sie an SetDIBits um es mit Ihren Daten zu füllen. Dies sind Funktionen, die ich gesehen habe, und die Setdibits sind ziemlich flexibel, obwohl ausführlich.

In meinen MFC -Jahren, CreateBitmap wurde aufgrund mutmaßlicher Leistungsprobleme vermieden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top