2013-04-19 1 views
2

Мне нужно создать HBITMAP.Рисование растрового изображения из памяти

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

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

Я делаю это так (если ресурс): Link

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 - это память, убирающая содержимое растрового изображения.

+0

CreateDIBitmap - это то, что вам нужно, но это сложная функция. Осмотрите пример кода. – john

+0

Можете ли вы показать мне пример? Я действительно много искал ... – 2013-04-19 11:26:50

+0

[createDIBSection] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd183494%28v=vs.85%29.aspx), [GetDIBits] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx) –

ответ

1

Во-первых, давайте удалим немного невинного Гоча:

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».

+0

Я попробовал CreateBitmap ... Но я не понимаю нескольких параметров ... (например, cplane, lpvBits). .. Итак, не могли бы вы дать какой-то код, чтобы продемонстрировать это? – 2013-04-19 15:26:12