Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание полотна с имеющимся DIB в памяти 
:(
    Опции темы
vdm
Дата 30.10.2010, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



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

Пробовал CreateDIBSection и CreateDIBitmap но используя их, требуется копировать полотно в изначальную область памяти для DIB... 
PM MAIL   Вверх
Alexeis
Дата 30.10.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vdm
Дата 30.10.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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. Такое практически возможно?
PM MAIL   Вверх
Alexeis
Дата 30.10.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



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

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

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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vdm
Дата 30.10.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата

Если вопрос производительности беспокоит, то можно отобразить файл (если это файл) в память, а затем сделать 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 - выходной параметер...


PM MAIL   Вверх
Alexeis
Дата 30.10.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vdm
Дата 30.10.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Получается, если картинка не в файле, то копировать память придётся как минимум 2 раза... :/
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.