Есть 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 headerif (!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 сделать).
Копаю дальше. Если я создаю 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 картинки в нужном формате.
Чего я не понял?
Re: Создать HBITMAP из байтов BMP-файла в памяти (SetDIBits/CreateCompatibleBitm
Здравствуйте, пффф, Вы писали:
П>Здравствуйте!
П>Есть BMP файл произвольного формата (1/4/8/16/24/32 бита на цвет), он лежит в памяти
П>У меня есть (не зависящие от виндовых хидеров, но дублирующие их) структуры, BitmapFileHeader и BitmapInfoHeader, с их помощью я распарсил заголовки, и узнал базовую инфу — размер картинки и тп П>Чего я не понял?
[skipped]
Можно попробовать грузить из памяти через IStream, или GDI+ поюзать.
Надо создать hdc = CreateCompatibleDC(0)
Надо создать пустую битмапку через CreateBitmap — размер 1x1, nPlanes и nBitCount беру из прочитанного заголовка, lpBits задаю 0
Затем — выбираю её в hdc
Затем создаю CreateCompatibleBitmap
Затем SetDIBits
И дело в шляпе (но пака ещё не проверил).
Блин, как всё просто-то
Re[2]: Создать HBITMAP из байтов BMP-файла в памяти (SetDIBits/CreateCompatibleB
А вот фиг.
П>Похоже, я нашел, что нужно.
П>Надо создать hdc = CreateCompatibleDC(0) П>Надо создать пустую битмапку через CreateBitmap — размер 1x1, nPlanes и nBitCount беру из прочитанного заголовка, lpBits задаю 0 П>Затем — выбираю её в hdc
Ломается на данном этапе
SelectObject(hdc, hBmpPattern);
Здравствуйте, пффф, Вы писали:
П>Здравствуйте, пффф, Вы писали:
П>GetLastError() возвращает 6 — ERROR_INVALID_HANDLE
П>Хотя перед этим CreateCompatibleDC(0) и CreateBitmap вернули не 0:
Что возвращает GetObjectType на полученный Gdi Handle?
Хотя и упомянутая выше GetObjectType, может тупить, и работать не очень прям синхронно по факту вызова.
Лично, в своем же коде видел как на DeletObject (HFONT) возвращала TRUE.
А вот строчкой ниже Винда радостно говорила на GetObjectType(тот же самый HFONT, убитый строчкой выше) == OBJ_FONT (всё ништяк, чувак — шрифт живой).
Здравствуйте, Carc, Вы писали:
C>Лично, в своем же коде видел как на DeletObject (HFONT) возвращала TRUE. C>А вот строчкой ниже Винда радостно говорила на GetObjectType(тот же самый HFONT, убитый строчкой выше) == OBJ_FONT (всё ништяк, чувак — шрифт живой).
По битам самого хэндла тип объекта определяется.
GDI только 16 бит хэндла использует под индекс в таблице, а остальное — под информацию о типе и т.п.
Re[5]: Создать HBITMAP из байтов BMP-файла в памяти (SetDIBits/CreateCompatibleB
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, Carc, Вы писали:
C>>Лично, в своем же коде видел как на DeletObject (HFONT) возвращала TRUE. C>>А вот строчкой ниже Винда радостно говорила на GetObjectType(тот же самый HFONT, убитый строчкой выше) == OBJ_FONT (всё ништяк, чувак — шрифт живой).
Q>По битам самого хэндла тип объекта определяется. Q>GDI только 16 бит хэндла использует под индекс в таблице, а остальное — под информацию о типе и т.п.
Не тот случай.
Я тогда специально проверял этот убитый HGDIOBJ на Font, в отдельном куске кода, который выполнялся несколько погодя...
Дык вот в куске кода (который "погодя") уже ожидаемо было: GetObjectType(на убитый шрифт) выдавало ожидаемое значение OBJ_ERROR.