Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Снова BITMAP, проблема с SetDIBits в Windows ХР  (Прочитано 12903 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
LYUDMILA
Гость
« : 03-05-2006 20:11 » 

Друзья, помогите! Проблема с формированием bitmap в памяти с помощью CreateDIBSection и SetDIBits. Проблема появилась при переходе на Windows XP. В 98 все прекрасно работало, а в ХР SetDIBits выдает ошибку "Недостаточно памяти для обработки команды". Размер всего лишь 640х480. Кто сталкивался с такой проблемой и решил ее? В форумах встречала вопросы об этой проблеме,  но вразумительно никто нигде не ответил, только ответы типа, "а ты попробуй вот это...".  А черт его знает...
Записан
acc15
Гость
« Ответ #1 : 03-05-2006 20:32 » new

а по конкретней? требуется сделать DIB из HBITMAP(тогда зачем CreateDIBSection)?? или наоборот? или что вообще... битмапов их много...

Для HBITMAP используют CreateDIBitmap (там можно с инициализацией сразу прям из DIB сделает HBITMAP), а SetDIBits потом менять (если нужно)

Да и ещё SetDIBits никогда не ругнется на память потому что выделять её незачем, всё уже должно быть выделено до SetDIBits. SetDIBits занимается лишь конвертированием(если нужно) и копированием пикселей и не более.
« Последнее редактирование: 03-05-2006 20:41 от acc15 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 03-05-2006 21:57 » 

насчёт нехватки памяти - это похоже где-то в программе утечка памяти
Записан

LYUDMILA
Гость
« Ответ #3 : 04-05-2006 08:06 » 

Дело в том, что существует массив точек в формате RGB - 24 бита на пиксель, из него надо сформировать битмар и отобразить  в Image через Image1->Picture->Bitmap->Handle=HBM;
Массив обрабатывается по ходу программы. Насколько я понимаю, надо действовать через DIBSection. Затем заполнять с помощью SetDIBits. Скорее всего память выделяет CreateDIBSection, а SetDIBits не может заполнить.
Я уже и сама думала, что надо идти в обход, другими командами. Но почему в 98 работало, вот главный аргумент. Что изменилось? Ошибка то плавающая. Программа то отрабатывает, то нет.
Записан
acc15
Гость
« Ответ #4 : 04-05-2006 21:32 » 

Что-то мне сильно подсказывает что не на VC ты пишешь...
Ну впрочем это неважно

Делается всё просто... проще некуда:
1. CreateDIBitmap(...). // она всё выделит...
2. Потом когда нужно изменять SetDIBits(...).
Если нужен пример то напиши, но про CreateDIBSection забудь... Не создаст он тебе нормальный HBITMAP и не должен создавать ни в 98 ни в ХР, так что странно что вообще что-то работало...

Цитата
The CreateDIBSection function creates a DIB that applications can write to directly. The function gives you a pointer to the location of the bitmap bit values. You can supply a handle to a file-mapping object that the function will use to create the bitmap, or you can let the system allocate the memory for the bitmap.

ЗЫ: если пример нужен напиши

Записан
LYUDMILA
Гость
« Ответ #5 : 05-05-2006 06:38 » 

Будь другом, брось пример. Спасибо.
Записан
LYUDMILA
Гость
« Ответ #6 : 06-05-2006 08:37 » 

Мой код
  bminfo.bmiHeader.biSize=40;
  bminfo.bmiHeader.biWidth=w;
  bminfo.bmiHeader.biHeight=h;
  bminfo.bmiHeader.biPlanes=1;
  bminfo.bmiHeader.biBitCount=24;
  bminfo.bmiHeader.biCompression=BI_RGB;
  bminfo.bmiHeader.biSizeImage=((bminfo.bmiHeader.biWidth * 24 +31)& ~31) /8 * bminfo.bmiHeader.biHeight;

  dc= CreateCompatibleDC(NULL);
  HBM=CreateDIBSection(dc,(LPBITMAPINFO) &bminfo,DIB_RGB_COLORS,pV,NULL,0);
... здесь еще проверяю GetLastError - Недостаточно памяти для обработки команды
  while(!GdiFlush());
  int iS=SetDIBits(dc, HBM, 0, h, pBGR, (LPBITMAPINFO) &bminfo, DIB_RGB_COLORS);

Пробовала заменить CreateDIBSection на CreateDIBitmap (ясно, с другими параметрами) - черный кадр.
Пишу на Билдере.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines