![]() |
|
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]()
|
|
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Есть выделенная память в которой находится DIB (BITMAP изображение). Можно ли создать полотно (для нанесения дополнительного контекста), указав на уже существующию область памяти BITMAP, для нанесения изменений на полотно, дабы обойтись без копирований областий памяти (когда приходится копировать полотно назад в DIB)?
Пробовал CreateDIBSection и CreateDIBitmap но используя их, требуется копировать полотно в изначальную область памяти для DIB... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Связать с битмапом графический контекст DC и рисовать. Создаем контекст CreateCompatibleDC . Связываем контекст с бимапом или dib SelectObject . Рисуем как на любом другом контексте. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Alexeis, наверное я не совсем ясно выразился по поводу имеющегося DIB в мапяти...
Ситуация такова: имеется BMP картинка загруженная в память. Расположена она под следующей структурой: LPBITMAPINFOHEADER lpDib = new BYTE[43200 + sizeof(BITMAPINFOHEADER)]; Сама картинка занимает 43200 байт в памяти. Доступ к буферу доступен по адресу: LPBYTE lpBuffer = (LPBYTE) lpDib + sizeof(BITMAPINFOHEADER); Ну а количество байт sizeof(BITMAPINFOHEADER) - эта структурная инфо о буфере, которая идёт впереди. Так вот задача, связать lpBuffer и графический контекст DC, избежав повторного выделения памяти под буфер для DC, а использовать имеющиюся область памяти lpBuffer. Такое практически возможно? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Без копирования не знаю способа. Если вопрос производительности беспокоит, то можно отобразить файл (если это файл) в память, а затем сделать DIB секцию. Тогда память будет выделяться всего 1 раз. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| vdm |
|
||||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Именно это и нужно (выделить память только один раз). Только в твоих словах неточность.
отображаю:
создаю: CreateDIBSection
Только выделение памяти получается 2 раза: 1. отображение файла (если это файл) в память 2. при создании DIB секции. Так как MSDN пишет о CreateDIBSection так:
ppvBits - выходной параметер... |
||||||||||||||
|
|||||||||||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Это не отображение. Отображение делается при помощи CreateFileMapping и т.д. Отображенный файл не загружается в память целиков, а грузиться по мере необходимости. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| vdm |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Получается, если картинка не в файле, то копировать память придётся как минимум 2 раза... :/
|
|||
|
||||
![]()
|
| Вы можете найти полезным что... | |
|
|
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |