Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Проблемы с выводом цветного битмапа


Автор: Royan 14.10.2005, 21:20
Я пользуюсь библиотекой 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;


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

Автор: GremlinProg 15.10.2005, 07:53
А зачем ты в 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);

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

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

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

Автор: Royan 16.10.2005, 15:58
Mad ты прав. +1 в твою пользу smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)