Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Создание полотна с имеющимся DIB в памяти


Автор: vdm 30.10.2010, 02:25
Есть выделенная память в которой находится DIB (BITMAP изображение). Можно ли создать полотно (для нанесения дополнительного контекста), указав на уже существующию область памяти BITMAP, для нанесения изменений на полотно, дабы обойтись без копирований областий памяти (когда приходится копировать полотно назад в DIB)?

Пробовал CreateDIBSection и CreateDIBitmap но используя их, требуется копировать полотно в изначальную область памяти для DIB... 

Автор: Alexeis 30.10.2010, 11:41
Цитата(vdm @  30.10.2010,  03:25 Найти цитируемый пост)
 Можно ли создать полотно (для нанесения дополнительного контекста)

  Связать с битмапом графический контекст DC и рисовать. Создаем контекст CreateCompatibleDC . Связываем контекст с бимапом или dib SelectObject . Рисуем как на любом другом контексте.

Автор: vdm 30.10.2010, 13:56
Alexeis, наверное я не совсем ясно выразился по поводу имеющегося DIB в мапяти...

Ситуация такова:

имеется BMP картинка загруженная в память. Расположена она под следующей структурой:

LPBITMAPINFOHEADER lpDib = new BYTE[43200 + sizeof(BITMAPINFOHEADER)];

Сама картинка занимает 43200 байт в памяти. Доступ к буферу доступен по адресу:

LPBYTE lpBuffer = (LPBYTE) lpDib + sizeof(BITMAPINFOHEADER);

Ну а количество байт sizeof(BITMAPINFOHEADER) - эта структурная инфо о буфере, которая идёт впереди.

Так вот задача, связать lpBuffer и графический контекст DC, избежав повторного выделения памяти под буфер для DC, а использовать имеющиюся область памяти lpBuffer. Такое практически возможно?

Автор: Alexeis 30.10.2010, 14:11
Цитата(vdm @  30.10.2010,  14:56 Найти цитируемый пост)
имеется BMP картинка загруженная в память. Расположена она под следующей структурой:

LPBITMAPINFOHEADER lpDib = new BYTE[43200 + sizeof(BITMAPINFOHEADER)];

Сама картинка занимает 43200 байт в памяти. Доступ к буферу доступен по адресу:

  Без копирования не знаю способа. Если вопрос производительности беспокоит, то можно отобразить файл (если это файл) в память, а затем сделать DIB секцию. Тогда память будет выделяться всего 1 раз.

Автор: vdm 30.10.2010, 14:24
Цитата

Если вопрос производительности беспокоит, то можно отобразить файл (если это файл) в память, а затем сделать DIB секцию. Тогда память будет выделяться всего 1 раз. 

Именно это и нужно (выделить память только один раз). Только в твоих словах неточность.
Цитата

можно отобразить файл (если это файл) в память

отображаю: 
Код

LPBITMAPINFOHEADER lpDib = new BYTE[43200 + sizeof(BITMAPINFOHEADER)]; // (в эту память забивается файл)

Цитата

затем сделать DIB секцию

создаю: CreateDIBSection
Цитата

Тогда память будет выделяться всего 1 раз. 

Только выделение памяти получается 2 раза:
1. отображение файла (если это файл) в память
2. при создании DIB секции. Так как MSDN пишет о CreateDIBSection так:
Код

HBITMAP CreateDIBSection(
  HDC hdc,                 // handle to DC
  CONST BITMAPINFO *pbmi,  // bitmap data
  UINT iUsage,             // data type indicator
  VOID **ppvBits,          // bit values
  HANDLE hSection,         // handle to file mapping object
  DWORD dwOffset           // offset to bitmap bit values
);


Цитата

ppvBits 
[out] Pointer to a variable that receives a pointer to the location of the DIB bit values. 


ppvBits - выходной параметер...


Автор: Alexeis 30.10.2010, 15:30
Цитата(vdm @  30.10.2010,  15:24 Найти цитируемый пост)
отображаю: 
Выделить всёкод C++
1:
    
LPBITMAPINFOHEADER lpDib = new BYTE[43200 + sizeof(BITMAPINFOHEADER)]; // (в эту память забивается файл)

  Это не отображение. Отображение делается при помощи CreateFileMapping и т.д. Отображенный файл не загружается в память целиков, а грузиться по мере необходимости.

Автор: vdm 30.10.2010, 23:57
Получается, если картинка не в файле, то копировать память придётся как минимум 2 раза... :/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)