Как заменить StretchDIBits на BitBlt

326
26 ноября 2016, 19:10

Здравствуйте! Использую такую функцию:

StretchDIBits(deviceContext, 0, 0, buffer->Width, buffer->Height, 0, 0, buffer->Width, buffer->Height, buffer->Memory, &buffer->Info, DIB_RGB_COLORS, SRCCOPY);

Но она медленная по сравнению с BitBlt. Вопрос в том, как ее заменить?

Answer 1

это делается проще всего где-то так:

// Создаём bitmap контекст
HBITMAP bm = CreateBitmap( buffer->Width,  buffer->Height, 1/*planes*/, buffer->Info.bmiHeader.biBitCount,  buffer->Memory);
HDC bmDC = CreateCompatibleDC(0);
SelectObject(bmDC,bm);
// Теперь можно рендерить
BitBlt(deviceContext, 0/*x*/,0/*y*/, buffer->Width,  buffer->Height, bmDC, 0,0, SRCCOPY);
// Что б не было утечки памяти, когда картинка не нужна - надо освободить память
DeleteDC(bmDC);
DeleteObject(bm);

Для работы с памятью на прямую, вам нужна таки секция:

void ** bits = null; 
HDC bmDC = CreateCompatibleDC(0);
HBITMAP bm = CreateDIBSection(bmDC,buffer->Info,DIB_RGB_COLORS,&bits,0,0);
SelectObject(bmDC,bm);

За тем вам нужно скопировать данные именно в выданый системой участок памяти и именно с bits работать. эту ссылку bits можно после копирования переписать в buffer->Memory https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd183494%28v=vs.85%29.aspx Освобождать (DeleteObject,DeleteDC) и рисовать (BitBlt) также само.

Рисовать win умеет только dc. Но эта dc должна быть связана с bitmap. Поэтому так.

Проверьте что б CreateBitmap возвращало не ноль. Ф-ция довольно "вредная". Она не все форматы поддерживает. Формат указывается в предпоследнем параметре. Ещё я сталкивался с тем, что строки картинки в некоторых случаях нужно выравнивать по границам двойного слова, иначе картинку "перекашивает" по диагонали набок.

Если надо загружать с памяти или с диска то можно так: Как загрузить картинку из памяти С++ (Win)?

READ ALSO
Покажите, как создать DLL со строками на C++

Покажите, как создать DLL со строками на C++

Пробовала разные варианты создания на выходе файла DLL, который содержит несколько строк, поскольку изучаю C# - C++ непонятен совсем

206
Подключение POCO dll C++

Подключение POCO dll C++

Пытаюсь подключить POCO-библиотекиСобрал dll проекта для работы с ZIP

234
Полный путь к файлу linux в программе С++

Полный путь к файлу linux в программе С++

Хочу написать программу, которая создаст мне файл не в папке самой программы, а в заданой мной директории линукс, например, ~/workspace/filetxt

221