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;
}}