Включите код загрузки PNG, чтобы использовать ФАЙЛ вместо локального ресурса

Я работаю над небольшим программным обеспечением, которое предназначено для отображения png-файла прямо на рабочем столе. я нашел способ сделать более позднюю часть со структурой HBITMAP. Тем не менее, я потратил несколько дней на поиск способа загрузки файла .PNG в такой HBITMAP.

Код, который я нашел eventuall (который я тоже мог скомпилировать) был на этой странице:

http://logiklabs.tumblr.com/post/22946728048/how-to-load-an-image-resource-into-a-hbitmap

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

Тем не менее мне нужна возможность использовать во время выполнения файл из (во время компиляции) неизвестного места.

Так, как я мог изменить тот сценарий, чтобы достигнуть этого?
Мои знания C ++, к сожалению, не самые лучшие, и MS-документация по этим функциям тоже не помогла: /

Я был бы очень, очень благодарен!

2

Решение

Похоже, вы можете просто загрузить файл PNG в оперативную память и передать его адрес и длину stbi_load_from_memory(), Вы в основном изменяете первую часть кода на связанной странице, чтобы загрузить файл в оперативную память, а затем продолжаете то же самое. Пример ниже:

static HBITMAP LoadImageResource(LPCTSTR filename)
{
unsigned char *res_data, *splash_image;
DWORD res_size;
int width, height, components;
BITMAPV5HEADER bmh;
HBITMAP hBitmapRet;
FILE* f = _tfopen(filename, "rb");

if (!f)
return NULL;

fseek(f, 0, SEEK_END);
res_size = ftell(f);
rewind(f);

res_data = new unsigned char[res_size];
fread(res_data, sizeof(unsigned char), res_size, f);
fclose(f);

splash_image = stbi_load_from_memory(res_data, res_size, &width, &height, &components, 0);

ZeroMemory(&bmh, sizeof(BITMAPV5HEADER));
bmh.bV5Size = sizeof(BITMAPV5HEADER);
bmh.bV5Width = width;
bmh.bV5Height = -height;
bmh.bV5Planes = 1;
bmh.bV5BitCount = 32;
bmh.bV5Compression = BI_BITFIELDS;
bmh.bV5RedMask = 0x00FF0000;
bmh.bV5GreenMask = 0x0000FF00;
bmh.bV5BlueMask = 0x000000FF;
bmh.bV5AlphaMask = 0xFF000000;

hBitmapRet = CreateDIBitmap(GetDC(NULL), (BITMAPINFOHEADER *) &bmh, CBM_INIT,
splash_image, (BITMAPINFO *) &bmh, DIB_RGB_COLORS);

stbi_image_free(splash_image);
delete[] res_data;
return hBitmapRet;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]