Win32 Изображение Загрузки C/C++ из памяти буферизует

Я хочу загрузить изображение (.bmp) файл на приложении Win32, но я не хочу использовать стандартный LoadBitmap/LoadImage из Windows API: Я хочу, чтобы это загрузилось от буфера, который уже находится в памяти. Я могу легко загрузить битовый массив непосредственно из файла и распечатать его на экране, но эта проблема делает меня застрявшим.

То, что я ищу, является функцией, которая работает как это:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height);
7
задан zondo 6 July 2016 в 03:34
поделиться

4 ответа

Nevermind, я нашел решение! Вот код инициализации:

std::ifstream is;
is.open("Image.bmp", std::ios::binary);
is.seekg (0, std::ios::end);
length = is.tellg();
is.seekg (0, std::ios::beg);
pBuffer = new char [length];
is.read (pBuffer,length);
is.close();

tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer;
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER));
RGBQUAD             rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER));

BITMAPINFO bi;
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;

char* pPixels = (pBuffer+bfh.bfOffBits);

char* ppvBits;

hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0);
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS);

GetObject(hBitmap, sizeof(BITMAP), &cBitmap);
6
ответ дан 6 December 2019 в 19:33
поделиться

Попробуйте CreateBitmap () :

HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height)
{
    return CreateBitmap(width, height, 1, 24, buffer);
}
4
ответ дан 6 December 2019 в 19:33
поделиться

Нет, но вы можете создать новое растровое изображение размером с текущее в памяти и записать на него свою структуру памяти.

Вы ищете функцию CreateBitmap . Установите lpvBits на свои данные.

0
ответ дан 6 December 2019 в 19:33
поделиться

CreateDIBSection может быть немного сложным в использовании, но одно из то, что он может сделать, - это создать независимое от устройства растровое изображение и предоставить вам указатель на буфер для битов растрового изображения. Конечно, у вас уже есть буфер, полный битов растрового изображения, но, по крайней мере, вы можете скопировать данные.

Уточнение: CreateDIBSection также может создавать растровые изображения из файловых объектов, и, вероятно, есть способ заставить Windows предоставить вам файловый объект, представляющий кусок памяти, что может обмануть CreateDIBSection , чтобы получить растровое изображение, построенное непосредственно из вашего буфера.

3
ответ дан 6 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: