Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с выводом цветного битмапа, как будто все дело в BitBlt 
:(
    Опции темы
Royan
Дата 14.10.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Я пользуюсь библиотекой EasyBMP для работы с BMP'шными картинками, но это только для сведения. Вот мой код внутри обработчика WM_PAINT:

Код

            BeginPaint(hwnd, &ps); 
            
            SelectObject(ps.hdc, hbmpCompat); 
            for (int i = 0; i < w; i++) {
                for(int j = 0; j < h; j++){
                    SetPixel(ps.hdc, i, j, 
                        RGB(bmp(i, j)->Red, bmp(i, j)->Green, bmp(i, j)->Blue));
                }
            }

            EndPaint(hwnd, &ps);

Он работает и выводит все цвета, которые присутствуют на BMP картинке. Естественно очень не эффективно каждый раз при поступлении по новой выводить рисунок. Поэтому я решил поступить так:

Код

      WM_CREATE:
      [...]
            hdc = GetDC(hwnd); 
 
            bmp.ReadFromFile("./sample2.bmp");
            w = bmp.TellWidth();
            h = bmp.TellHeight();
 
            hdcCompat = CreateCompatibleDC(hdc); 
            hbmpCompat = CreateCompatibleBitmap(hdcCompat, w, h);
  
           SelectObject(hdcCompat, hbmpCompat);

            for (int i = 0; i < w; i++) {
                for(int j = 0; j < h; j++){
                    SetPixel(hdcCompat, i, j, 
                        RGB(bmp(i, j)->Red, bmp(i, j)->Green, bmp(i, j)->Blue));
                }
            }
  
            ReleaseDC(hwnd, hdc); 
            [...]

      WM_PAINT:
            BeginPaint(hwnd, &ps); 
            
            SelectObject(ps.hdc, hbmpCompat);            
            BitBlt(ps.hdc, 0 ,0 , w, h, hdcCompat, 0, 0, SRCCOPY);
            
            EndPaint(hwnd, &ps);
            break;


В результате чего у меня выводятся только черные пиксели, все остальные заменяются на белые. Кто знает, в чем тут дело?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
GremlinProg
Дата 15.10.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



А зачем ты в WM_CREATE'е копируешь битмап попиксельно? Может, как раз в этом и ошибка.
Вместо этих циклов напиши:
Код

BitBlt(hdcCompat, 0 ,0 , w, h, hdcBitmap, 0, 0, SRCCOPY);

где hdcBitmap - это девайс, в который выбран твой bmp.
Я не использую EasyBMP, поэтому не знаю, есть ли в объекте bmp этот девайс, но даже если нет, то это аналог hdcCompat, поэтому можно просто создать второй memory-девайс и выбрать в него bmp, аналогично как и с hbmpCompat.
Добавлено @ 07:59
и ещё один момент:
обычно, при создании memory-девайсов, в качестве совместимого используют не девайс окна, а девайс рабочего стола, поэтому, чтобы не возникало лишних вопросов лучше писать так:
Код

hdc = GetDC(HWND_DESKTOP); 
hdcCompat = CreateCompatibleDC(hdc); 
hbmpCompat = CreateCompatibleBitmap(hdc, w, h);
SelectObject(hdcCompat, hbmpCompat);
ReleaseDC(HWND_DESKTOP,hdc);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Mad
Дата 15.10.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Общий смысл кода не понял (точней его необходимости smile) но вот тут у тебя ошибка
Цитата(Royan @ 14.10.2005, 20:20)
hbmpCompat = CreateCompatibleBitmap(hdcCompat, w, h);

по умолчанию (сразу после создания) у тебя в контексте выбрана одноцветный растр, по этому и результирующий получаеться тоже одноцветный надо так :
Код

hdc = GetDC(hwnd); 
 
hdcCompat = CreateCompatibleDC(hdc); 
hbmpCompat = CreateCompatibleBitmap(hdc, w, h);


Это сообщение отредактировал(а) Mad - 15.10.2005, 12:22


--------------------
user posted image
PM MAIL   Вверх
Royan
Дата 16.10.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Mad ты прав. +1 в твою пользу smile


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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