Рисование растрового изображения из памяти

Мне нужно создать HBITMAP.

Здесь кроется проблема. У меня есть содержимое файла bmp в памяти.

Я знаю, как создать HBITMAP, если растровое изображение было в качестве ресурса.
Но так как это в памяти, я не знаю, как это сделать.

Я делаю это так (если в ресурсе): Ссылка на сайт

    hDC = BeginPaint(hWnd, &Ps);

// Load the bitmap from the resource
bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
// Create a memory device compatible with the above DC variable
MemDCExercising = CreateCompatibleDC(hDC);
// Select the new bitmap
SelectObject(MemDCExercising, bmpExercising);

// Copy the bits from the memory DC into the current dc
BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);

// Restore the old bitmap
DeleteDC(MemDCExercising);
DeleteObject(bmpExercising);
EndPaint(hWnd, &Ps);

Пожалуйста, объясните мне, как это сделать, если бы это был ресурс памяти.
Как-то измениться char img[10000] в ресурс?
Вот, img память, ограничивающая содержимое растрового изображения.

2

Решение

Во-первых, давайте удалим маленькую невинную ошибку:

hDC = BeginPaint(hWnd, &Ps);

// Load the bitmap from the resource
bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
// Create a memory device compatible with the above DC variable
MemDCExercising = CreateCompatibleDC(hDC);
// Select the new bitmap
HOBJECT oldbmp = SelectObject(MemDCExercising, bmpExercising); //<<<<save it for later ...

// Copy the bits from the memory DC into the current dc
BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);

// Restore the old bitmap
SelectObject(MemDCExercising, oldbmp); //<<<... DeleteDC will leak memory if it holds a resource
DeleteDC(MemDCExercising);
DeleteObject(bmpExercising);
EndPaint(hWnd, &Ps);

Теперь HBITMAP — это (концептуально говоря) указатель на внутреннюю структуру, которая содержит «указатель» (на самом деле это гораздо больше, чем поток) на пространство памяти GDI, к которому вы не можете получить доступ.

«Растровое изображение памяти» не представлено в вашей программе как буфер памяти, который загружается в вашу программу, но как … HBITMAP, полученный с помощью CreateCompatibleBitmap, где параметр HDC — это DC, с которым должно быть совместимо растровое изображение. (обычно экран, окно или окраска DC).

Вы можете создать инициализированное растровое изображение, передавая буфер, содержащий исходные данные, или получить данные, которые содержит растровое изображение CreateBitmap или же GetBitmapBits.

В любом случае, это ваша локальная копия растровых данных, а не «живой растровый» GDI.

Также обратите внимание, что внутренняя структура этих данных зависит от формата (сколько бит на пиксель от количества плоскостей и с палитрой или без нее), которую должен иметь растровое изображение, и что, чтобы избежать потери производительности в процессе Blit, он должен совпадают с форматом, используемым вашей настройкой экрана.

Это необязательно должно совпадать с тем, которое имеет растровое изображение при сохранении в файл «bmp».

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector