Создание HBITMAP из буфера памяти

У меня есть приложение, которое загружает некоторые данные blob из базы данных, которые могут представлять форматированные в формате png или необработанные двоичные данные для различных растровых изображений и значков. Он хранится в std :: vector

. Я использую объекты CImageList для отображения различных изображений в виде дерева, изображений на панели инструментов и т. Д., Но проблема заключается в создании растровых изображений. из данных в памяти получаются нечеткими, как будто в них отсутствуют пиксели, когда вы делаете что-то вроде ниже:

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

Чтобы обойти эту проблему, я просто записываю data () в векторе во временный файл, а затем с помощью LoadImage считываю его обратно и создаю из него HBITMAP. Однако это работает отлично, что, по общему признанию, является бесстыдным приемом и, надеюсь, в нем нет никакой необходимости.

Я поискал в Интернете, но не нашел действительно хороших примеров того, как «правильно» создавать hbitmaps из памяти. Я хотел бы иметь возможность создавать эти растровые изображения для добавления в список изображений без каких-либо файловых операций ввода-вывода и ограниченного объема копирования данных, если это возможно.

Ищу лучший способ сделать это и, очевидно, код для 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) . Кто-нибудь знает простой способ инициализировать объект CBitmap из std :: vector ?

11
задан AJG85 5 January 2011 в 00:17
поделиться