odczytanie koloru pixela i zamiana

0

Witam,
chcę stworzyć program który przekształci obraz, a w zasadzie 2 na 3d (anaglif). Najpierw ma konwertować lewy na czerwono, prawy na niebiesko a potem je łączyć ale utknąłem na kroku 1. Po kliknięciu w przycisk nic się nie dzieje. Funkcje GetDiBits() i SetDiBits() zwracają prawidłową wartość linii pobranych i oddanych.
Nie mam pojęcia czego brakuje lub gdzie jest błąd...

#include <windows.h>
#include <iostream>



HINSTANCE hInst;
HWND krok1;
HBITMAP lewy1, prawy1;

BITMAP info_lewy1, info_prawy1;

BITMAPINFO bh;

BYTE *pLeftBits;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR lStart,INT nShow)
{

  lewy1=(HBITMAP)LoadImage(0,"lewybmp.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  if(lewy1==0)
  {
    MessageBox(0,"Nie można otworzyć pliku lewy.bmp z folderu z aplikacją","Brak pliku",MB_ICONERROR);
    return 0;
  }
  GetObject(lewy1,sizeof(BITMAP),&info_lewy1);


prawy1=(HBITMAP)LoadImage(0,"prawybmp.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  if(prawy1==0)
  {
    MessageBox(0,"Nie można otworzyć pliku prawy.bmp z folderu z aplikacją","Brak pliku",MB_ICONERROR);
    return 0;
  }
  GetObject(prawy1,sizeof(BITMAP),&info_prawy1);


  WNDCLASSEX wc;
  wc.hInstance=hInst;
  wc.lpszClassName=TEXT("Klasa okna");
  wc.lpfnWndProc=WndProc;
  wc.style=CS_DBLCLKS;
  wc.cbSize=sizeof(WNDCLASSEX);
  wc.hIcon=LoadIcon(0,IDI_APPLICATION);
  wc.hIconSm=LoadIcon(0,IDI_APPLICATION);
  wc.hCursor=LoadCursor(0,IDC_ARROW);
  wc.lpszMenuName=0;
  wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.cbWndExtra=0;
  wc.cbClsExtra=0;
  if(RegisterClassEx(&wc)==0) return 0;
  HWND Okno=CreateWindowEx(0,TEXT("Klasa okna"),TEXT("3D"),WS_OVERLAPPEDWINDOW,50,50,1000,700,0,0,hInst,0);
  MSG msgs;
  ShowWindow(Okno,nShow);
  UpdateWindow(Okno);
  while(GetMessage(&msgs,0,0,0))
  {
    TranslateMessage(&msgs);
    DispatchMessage(&msgs);
  }
  

  DeleteObject(lewy1);
   DeleteObject(prawy1);
  return msgs.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wPar,LPARAM lPar)
{
  HDC hdc,hdc1,hdc2, hdc99;


  PAINTSTRUCT ps;
  switch(msg)
  {
  	case WM_CREATE:
  		
  		krok1=CreateWindowEx(0,"BUTTON","Krok 1",WS_CHILD | WS_VISIBLE,1000/2-100,info_lewy1.bmHeight+10,200,50,hwnd,(HMENU)1,hInst,0);
  	break;
  	
	case WM_COMMAND:
	switch(wPar){
		case 1:
			int a,b;
				pLeftBits = new BYTE[bh.bmiHeader.biSizeImage];
			a=GetDIBits(GetDC(hwnd),lewy1,0,bh.bmiHeader.biHeight,pLeftBits,&bh,DIB_RGB_COLORS);
			
								
			for(int i=0;i<bh.bmiHeader.biSizeImage;i+=3){
				
					
				
						pLeftBits[i] = (byte)((double)pLeftBits[i]*0.299+(double)pLeftBits[i+1]*0.587+(double)pLeftBits[i+2]*0.114);	
						

		}
		b=SetDIBits(GetDC(hwnd),lewy1,0,bh.bmiHeader.biHeight,pLeftBits,&bh,DIB_RGB_COLORS);
	
	    char temp[10];
	    sprintf(temp,"%d",pLeftBits[5]);
	    SetWindowText(krok1,temp);
	
			break;
	}
	  
	break;
  	
    case WM_PAINT:
    hdc=BeginPaint(hwnd,&ps);


    hdc1=CreateCompatibleDC(hdc);
    hdc2=CreateCompatibleDC(hdc);


    lewy1=(HBITMAP)SelectObject(hdc1,lewy1);
    prawy1=(HBITMAP)SelectObject(hdc2,prawy1);


    BitBlt(hdc,1000/2-info_lewy1.bmWidth-10,0,info_lewy1.bmWidth,info_lewy1.bmHeight,hdc1,0,0,SRCCOPY);
    lewy1=(HBITMAP)SelectObject(hdc1,lewy1);
    BitBlt(hdc,1000/2+10,0,info_prawy1.bmWidth,info_prawy1.bmHeight,hdc2,0,0,SRCCOPY);
    prawy1=(HBITMAP)SelectObject(hdc2,prawy1);
   
   
    bh.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bh.bmiHeader.biWidth  = info_lewy1.bmWidth;
    bh.bmiHeader.biHeight = info_lewy1.bmHeight;
    bh.bmiHeader.biPlanes = 1;
    bh.bmiHeader.biBitCount = 32;
    bh.bmiHeader.biCompression = BI_RGB;
    bh.bmiHeader.biSizeImage = ((((bh.bmiHeader.biWidth * bh.bmiHeader.biBitCount) + 31) & ~31) >> 3) * bh.bmiHeader.biHeight;
    
	
    DeleteDC(hdc1);
    DeleteDC(hdc2);


    EndPaint(hwnd,&ps);
      break;
    case WM_DESTROY:
    	DestroyWindow(krok1);
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hwnd,msg,wPar,lPar);
  }
  return 0;
}} 
0

pLeftBits = new BYTE[bh.bmiHeader.biSizeImage];
Wyciek pamięci.

Po kliknięciu w przycisk nic się nie dzieje.
A co miało się dziać? Jedyne co widocznego robisz to SetWindowText.

0

a SetDiBits?

0

Pod Windows sądwie możliwości: albo jest aktywny Desktop Window Manager, albo nie jest.
Jeśli nie ma DWM, to okno jest odrysowywane tylko kiedy musi, np. po przywróceniu z paska zadań, albo odsłonięciu okna zasłoniętego innym oknem.

Jeśli jest DWM, to okno jest odrysowywane jeszcze rzadziej, bo DWM trzyma zawartość okna jako teksturę, i zwykłe zasłonięcie okna innym i odsłonięcie nie powoduje nawet odrysowywania tego odsłanianego okna.

InvalidateRect(hwnd, NULL, TRUE);
0

dziekii wielkie, całkiem o tym zapomniałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1