Не удается правильно загрузить растровое изображение из памяти

0

Краткое введение в проблему:
Я получил архив zip, где размещен набор файлов в формате BMP.
Я не хочу загружать растровые изображения из этого архива (создавать системные объекты) и передавать их HBITMAP клиенту, который отобразит его на экране.

Я попробовал два способа решить свою задачу:
1) с использованием временного файла (эти методы работают отлично, но я считаю, что он неэффективен - как требует дополнительных действий по созданию файла и требует, чтобы у пользователя были некоторые привилегии, которые позволяют ему создавать файлы)

hBitmap = (HBITMAP)LoadImage(NULL, fullpath.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION );

2) разархивировать необходимый файл в память и использовать буфер памяти для создания растрового изображения (Мое решение основано на информации из похожих вопросов о SO и других источниках)

BITMAPFILEHEADER* bmfh = (BITMAPFILEHEADER*)ibuf;
BITMAPINFOHEADER* bmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER));
BITMAPINFO* bmi = (BITMAPINFO*)bmih;
void* pBMPdata = (void*)(ibuf + bmfh->bfOffBits);
hBitmap = CreateDIBitmap(NULL, bmih, CBM_INIT, pBMPdata, bmi, DIB_RGB_COLORS);

Мне нужна помощь по 2-му пути. Когда изображение загружается из HBITMAP, полученного по второму методу, отображается черный квадрат /

ОБНОВИТЬ:
Я попробовал 3-й метод:

BITMAPFILEHEADER* pBmfh = (BITMAPFILEHEADER*)ibuf;
BITMAPINFOHEADER* pBmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER));
BITMAPINFO* pBmi = (BITMAPINFO*)pBmih;
void* pBMPdata = (void*)(ibuf + pBmfh->bfOffBits);
void* pToFill = 0;
hBitmap = CreateDIBSection(NULL, pBmi, DIB_RGB_COLORS, &pToFill, NULL, NULL);

Результат: черный квадрат, который имеет размеры изображения, которое я пытаюсь загрузить.

Любые идеи, которые могут помочь, оценены!

Теги:
winapi
bitmap

1 ответ

0
Лучший ответ

Может быть полезно для других, как может возникнуть эта проблема (черный квадрат, который имеет размеры изображения, которое вы пытаетесь загрузить).

Работает 3-й метод.

BITMAPFILEHEADER* pBmfh = (BITMAPFILEHEADER*)ibuf;
BITMAPINFOHEADER* pBmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER));
BITMAPINFO* pBmi = (BITMAPINFO*)pBmih;
void* pBMPdata = (void*)(ibuf + pBmfh->bfOffBits);
void* pToFill = 0;
hBitmap = CreateDIBSection(NULL, pBmi, DIB_RGB_COLORS, &pToFill, NULL, NULL);

memcpy(pToFill, pBMPdata, pBmfh->bfSize - pBmfh->bfOffBits); // this line should be added!!

Моя ошибка заключалась в том, что я пытался передать указатель на указатель на данные, вместо этого я должен после того, как invokage скопировать databits в пустоту (это pToFill). **

Ещё вопросы

Сообщество Overcoder
Наверх
Меню