Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > GetDIBits - получить растр |
Автор: Annuta 22.2.2007, 13:57 | ||
Привет... У меня прога выводит гифовские анимашки на экранчик через USB порт. Беру и в цикле раскладываю каждый кадр в массив RGB и уже этот массив передаю в порт. Раньше пользовалась GetPixel(); Но уж оочень она медленная - хочу переделать это на GetDIBits ... нашла код ... переписала ... и ошибок не выдаёт - но и в массиве pBits ничего нет !!! Хотя там по моему разумению должен быть растр картинки т.е. RGB сост каждого бита... привожу код Помогите плиз ...
|
Автор: MoZy 22.2.2007, 21:01 |
Попробуй так. Оброти внимание на выделенный текст BITMAPINFOHEADER bmi = {0}; bmi.biSize = sizeof (BITMAPINFOHEADER); bmi.biWidth = YARD_W*2; bmi.biHeight = YARD_W/2; bmi.biPlanes = 1; bmi.biBitCount = 1; BYTE *lpBits; CreateDIBSection(hdc,(BITMAPINFO*)&bmi,DIB_RGB_COLORS,(void**)&lpBits,NULL,0); |
Автор: akahan 24.2.2007, 02:29 | ||
Вот мой код, который работает! Функция GrayBitmap получает битмап, который обесцвечивает и возвращает обратно. По аналогии можете найти ошибку в вашем коде или спользовать мой для ваших целей!
Если сделаете по аналогии, то ваш код будет работать гораздо быстрее GetPixel ![]() |
Автор: MoZy 24.2.2007, 19:27 |
akahan, да уж. GetPixel - это тормаз GDI. Слушай, а тебе не нада к твоему коду еще код смешения цвета, чтоб самому прозрачность делать? Если картинка маленькая или не в реалтайме, то можно сделать с автоматическим антиалиасингом (если рисуешь например в Фотошопе). Все картинки так же будут с полупрозрачными краями. |
Автор: akahan 24.2.2007, 19:46 |
MoZy, нет не надо тут ничего добавлять! Какой будет исходный битмап, такой будет и обесцвеченная копия. Если будет с альфа-каналом, то он не изменится! ![]() |
Автор: GremlinProg 24.2.2007, 23:03 |
Annuta, дибы не совместимы с девайсом 0. Поэтому в CreateCompatibleDC необходимо передавать девайс экрана. И еще один момент. При использовании 24 битного растра, Каждая строка должна быть выровнена на границе двойного слова. Если хочешь идти по простому пути, то установи 32 бита, тогда pBits будет точно указывать на массив RGBQUAD, который не нужно выравнивать. |
Автор: akahan 25.2.2007, 09:09 |
Annuta, вы бы хоть в курсе нас держали, как идет написание кода? ![]() Люблю девушек-кодеров! ![]() |
Автор: Annuta 26.2.2007, 09:29 | ||||
Привет народ.. спасибо за наставление - у меня 16 битовый растр - с этим проблем нет... У меня всё получилось Спасибо akahan... а вот переложить биты RGB правильно не получается... краски плывут... Самое интресное что на одних гифах плывут а на других нет !!! просто мистика какя-то !!! а это моя структура...
А так я вызываю функцию...
... Может кто с такой проблемой знаком ??? Присоединённый файл отображается неправильно... к сожелению не могу поместить сразу два файла... чтобы и тот выложить который правильно работает... |
Автор: zkv 28.2.2007, 04:59 |
Annuta, вам GremlinProg, уже рассказал про выравнивание по DWORD, отсюда и мистика, в одном случае ширина картинки кратна 4 == sizeof(DWORD) и все правильно смотрится, в другом случае получаете проблемы с выравниванием и все плывет. PS картинку вашу форум не дает посмотреть ![]() |
Автор: Earnest 28.2.2007, 16:33 |
Annuta, действительно, у DIB и зависимого битмапа разное выравнивание: на 4 и на 2 байта соответственно. Поэтому длины строк в общем случае не совпадают. За этим нужно следить при перекладывании информации туда-сюда.. |