Здравствуйте!
Есть 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 картинки в нужном формате.
Чего я не понял?