Создать HBITMAP из байтов BMP-файла в памяти (SetDIBits/CreateCompatibleBitmap)
От: пффф  
Дата: 19.02.24 10:31
Оценка:
Здравствуйте!

Есть BMP файл произвольного формата (1/4/8/16/24/32 бита на цвет), он лежит в памяти

У меня есть (не зависящие от виндовых хидеров, но дублирующие их) структуры, BitmapFileHeader и BitmapInfoHeader, с их помощью я распарсил заголовки, и узнал базовую инфу — размер картинки и тп

  Скрытый текст
        BitmapFileHeader fileHdr;
        if (!fileHdr.extractFromRawData(bmpRawData, 0u))
        {
            return (HBITMAP)0;
        }

        if (fileHdr.bfType!=0x4d42) // the ASCII string "BM"
        {
            return (HBITMAP)0;
        }

        BitmapInfoHeader bmpHeader; // follows immediately file header
        if (!bmpHeader.extractFromRawData(bmpRawData, sizeof(fileHdr)))
        {
            return (HBITMAP)0;
        }

        int xSize = (int)bmpHeader.biWidth ;
        int ySize = (int)bmpHeader.biHeight;
        if (xSize<0)
            xSize = -xSize;
        if (ySize<0)
            ySize = -ySize;


Далее собаководы говорят, что надо сделать CreateCompatibleBitmap и SetDIBits (или за один вызов CreateDIBitmap сделать).

Я так делаю, вроде отрабатывает, но
        BITMAP bm;
        if (hbmp!=0 && GetObject(hbmp,sizeof(bm),&bm)==0)
        {
            DeleteObject((HGDIOBJ)hbmp);
            hbmp = 0;
        }


возвращает мне, что у меня картинка монохромная

Копаю дальше. Если я создаю HDC при помощи CreateCompatibleDC, то там:

Note: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it. If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap.


Я кажется понял, почему я получаю монохромную картинку. Ок.
Хорошо, я допустим возьму экранный DC через GetDC. Я пока не проверил, но у меня есть подозрение, что там если и будет не монохромная битмапка, то она будет 24бпп, а если я гружу картинку с 32бпп с альфаканалом?

Тут какой-то замкнутый круг — для того чтобы загрузить в HBITMAP картинку в нужном формате, нужно создать hdc с картинкой в нужном формате, а для этого нужно иметь HBITMAP картинки в нужном формате.

Чего я не понял?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.