Создать независимое от устройства растровое изображение без выделения памяти - PullRequest
0 голосов
/ 21 июня 2019

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

auto b = ::FreeImage_Load(type, path.c_str());
void *bits;

auto hbmp = CreateDIBSection(
    dc,
    FreeImage_GetInfo(bitmap),
    DIB_RGB_COLORS,
    &bits,
    0,
    0
);

std::memcpy(bits, FreeImage_GetBits(b), size);

Это работает очень хорошо, но я бы хотел избежать выделения памяти дважды - ::FreeImage_Load уже хранит данные в путиэто подходит для бабки.Есть ли способ вызова CreateDIBSection, который бы предотвращал выделение и заставлял dib, созданный таким образом, использовать предоставленный мной буфер?Если нет, то есть ли другой способ, который позволил бы это?

Кажется, что предоставление NULL вместо **ppvBits предотвращает выделение - есть ли способ изменить адрес буфера позже?Я также пытался возиться с параметром hSection, но созданные таким образом метки были неверными.

1 Ответ

0 голосов
/ 21 июня 2019

Полагаю, я не понял вашу идею неправильно.

Может быть, вы можете использовать CreateDIBitmap для преобразования FreeImage изображений в HBITMAP.

FIBITMAP *dib = FreeImage_Load(type, path.c_str());
// ...
HBITMAP bitmap = CreateDIBitmap(hDC, FreeImage_GetInfoHeader(dib),

CBM_INIT, FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);

// ...
FreeImage_Unload(dib);

Ссылки по теме: Как преобразовать изображение FreeImage в HBITMAP?

Если вы хотите использовать CreateDIBSection, вы можете использовать ненулевой hSection аргумент и использовать CreateFileMapping и MapViewOfFileEx() для создания раздела, последний lpBaseAddress должен указывать на ваши биты.

Не забудьте полностью инициализировать параметры в MapViewOfFileEx и CreateFileMapping.

Вот аналогичное обсуждениеВы можете обратиться: Как создать HBITMAP, оборачивающий существующий байтовый буфер?

...