| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Создание полотна с имеющимся DIB в памяти |
| Автор: vdm 30.10.2010, 02:25 |
| Есть выделенная память в которой находится DIB (BITMAP изображение). Можно ли создать полотно (для нанесения дополнительного контекста), указав на уже существующию область памяти BITMAP, для нанесения изменений на полотно, дабы обойтись без копирований областий памяти (когда приходится копировать полотно назад в DIB)? Пробовал CreateDIBSection и CreateDIBitmap но используя их, требуется копировать полотно в изначальную область памяти для DIB... |
| Автор: Alexeis 30.10.2010, 11:41 |
Связать с битмапом графический контекст 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. Такое практически возможно? |
| Автор: vdm 30.10.2010, 14:24 | ||||||||||||||
Именно это и нужно (выделить память только один раз). Только в твоих словах неточность.
отображаю:
создаю: CreateDIBSection
Только выделение памяти получается 2 раза: 1. отображение файла (если это файл) в память 2. при создании DIB секции. Так как MSDN пишет о CreateDIBSection так:
ppvBits - выходной параметер... |
| Автор: Alexeis 30.10.2010, 15:30 | ||
Это не отображение. Отображение делается при помощи CreateFileMapping и т.д. Отображенный файл не загружается в память целиков, а грузиться по мере необходимости. |
| Автор: vdm 30.10.2010, 23:57 |
| Получается, если картинка не в файле, то копировать память придётся как минимум 2 раза... :/ |