Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Bitmaps bit a bit

Estas en el tema de Bitmaps bit a bit en el foro de C/C++ en Foros del Web. Hola mi problema es que quiero conseguir la matriz RGB de los mapas de bits, pero aun soy un poco novato, me gustaría poder hacer ...
  #1 (permalink)  
Antiguo 01/05/2013, 05:22
 
Fecha de Ingreso: mayo-2013
Ubicación: Rubí(Barcelona)
Mensajes: 1
Antigüedad: 10 años, 11 meses
Puntos: 0
Bitmaps bit a bit

Hola mi problema es que quiero conseguir la matriz RGB de los mapas de bits, pero aun soy un poco novato, me gustaría poder hacer una especie de deteccion de colisiones pixel a pixel para mis videojuegos, pero no consigue averiguar como fuciona (siempre hay errores^^), creo que el problema esta en el createdibsection
pero mejor me ayudais vosotros^^.Este es el código que he hecho:

#include <Windows.h>

//Prototipo
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);


//Variables globales
int x = 0;
int y = 0;
int AnchoVentana;
int AlturaVentana;
HDC hDCAux;
HBITMAP g_Bitmap;


//Funciones auxiliares
bool CrearVentana(HINSTANCE hInstancia, HWND& hVentana, UINT Ancho, UINT Altura, LPCWSTR ClaseVentana, LPCWSTR TituloVentana, int& nCmdShow);
void Inicializar(HWND hVentana);
bool bitmap(HDC hDC);



int WINAPI wWinMain(HINSTANCE hInstancia, HINSTANCE hInstaciaPrev, LPWSTR lpszCmdParam, int nCmdShow )
{
HWND hVentana;
MSG Mensaje;
CrearVentana(hInstancia, hVentana, 500, 500,L"Mi Ventana", L"Practica 1", nCmdShow);
while(TRUE == GetMessage(&Mensaje, 0, 0, 0))
{
if (PeekMessage(&Mensaje, NULL, 0, 0, PM_REMOVE) )
{
if (Mensaje.message == WM_QUIT)
break;
TranslateMessage(&Mensaje);
DispatchMessage(&Mensaje);
}
else
{

HDC hDCPant = GetDC(hVentana);
bitmap(hDCPant);
BitBlt(hDCPant, 0, 0, AnchoVentana, AlturaVentana, hDCAux, 0, 0, SRCCOPY);
ReleaseDC(hVentana, hDCPant);

Controles();
}
}
return Mensaje.wParam;
}

bool CrearVentana(HINSTANCE hInstancia, HWND& hVentana, UINT Ancho, UINT Altura, LPCWSTR ClassName, LPCWSTR WindowName, int& nCmdShow)
{

WNDCLASSEX ClaseVentana;
ClaseVentana.hInstance = hInstancia;
ClaseVentana.lpszClassName = ClassName;
ClaseVentana.lpfnWndProc = WindowProcedure;
ClaseVentana.style = CS_HREDRAW || CS_VREDRAW;
ClaseVentana.cbSize = sizeof(WNDCLASSEX);

ClaseVentana.hIcon = LoadIcon(NULL, IDI_APPLICATION);
ClaseVentana.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
ClaseVentana.hCursor = LoadCursor(NULL, IDC_ARROW);
ClaseVentana.lpszMenuName = NULL;
ClaseVentana.cbClsExtra = 0;
ClaseVentana.cbWndExtra = 0;
ClaseVentana.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);

if (!RegisterClassEx(&ClaseVentana))return false;

if (ClaseVentana.lpszMenuName != NULL)
AlturaVentana += GetSystemMetrics(SM_CYMENU);

AnchoVentana = Ancho + GetSystemMetrics(SM_CXFIXEDFRAME)*2;
AlturaVentana = Altura + GetSystemMetrics(SM_CYFIXEDFRAME)*2;

int X = (GetSystemMetrics(SM_CXSCREEN) - AnchoVentana) / 2;
int Y = (GetSystemMetrics(SM_CYSCREEN) - AlturaVentana) / 2;
hVentana = CreateWindowEx(0,
ClassName,
WindowName,
WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,
X, Y,
AnchoVentana, AlturaVentana,
NULL,
NULL,
hInstancia,
NULL);

if(!hVentana)
return false;

ShowWindow(hVentana, nCmdShow);
UpdateWindow(hVentana);

return true;
}


LRESULT CALLBACK WindowProcedure(HWND hVentana, UINT Mensaje, WPARAM wParam, LPARAM lParam)
{

switch(Mensaje)
{
case WM_CREATE:
Inicializar(hVentana);
break;
case WM_DESTROY:
DeleteObject(hDCAux);
DeleteObject(g_Bitmap);
PostQuitMessage(0);
break;

case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hVentana, &ps);
EndPaint(hVentana, &ps);
break;
}
return DefWindowProc(hVentana, Mensaje, wParam, lParam);
}

void Inicializar(HWND hVentana)
{
HDC hDC;
hDC = GetDC(hVentana);
hDCAux = CreateCompatibleDC(hDC);
g_Bitmap = CreateCompatibleBitmap(hDC, AnchoVentana, AlturaVentana);
SelectObject(hDCAux, g_Bitmap);
DeleteObject(hDC);

}


bool bitmap(HDC hDC)
{

BITMAPINFOHEADER bmiHeader;
RGBQUAD nColores[256];

//Lectura del archivo, crea el handle al archivo
HANDLE hFile = CreateFile(L"ladron.bmp",
GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if(hFile == INVALID_HANDLE_VALUE)
return false;

BITMAPFILEHEADER bmfHeader;//Bufer de la cabecera del archivo
DWORD dwBytesRead;

//Leer la cabecera del archivo del Bitmap
BOOL bOK = ReadFile(hFile,
&bmfHeader, sizeof(BITMAPFILEHEADER),
&dwBytesRead, NULL);

if ( (!bOK) || (dwBytesRead != sizeof(BITMAPFILEHEADER) ) || (bmfHeader.bfType != 0x4D42) )
{
CloseHandle(hFile);
return false;
}


BITMAPINFO* pBitmapInfo = (new BITMAPINFO);//Buffer de la información de la cabecera

if(pBitmapInfo != NULL)
{ //Lee la cabecera de informacion del Bitmap.
bOK = ReadFile(hFile, pBitmapInfo, sizeof(BITMAPINFOHEADER),
&dwBytesRead, NULL);

if ( (!bOK) || (dwBytesRead != sizeof(BITMAPINFOHEADER) ) )
{
CloseHandle(hFile);
return false;
}

if(pBitmapInfo->bmiHeader.biSize != sizeof(BITMAPINFOHEADER))
SetFilePointer(hFile, pBitmapInfo->bmiHeader.biSize - sizeof(BITMAPINFOHEADER),
NULL, FILE_CURRENT);

//Leer la informacion del color del Bitmap
bOK = ReadFile(hFile, nColores,
pBitmapInfo->bmiHeader.biHeight * pBitmapInfo->bmiHeader.biWidth * sizeof(RGBQUAD),
&dwBytesRead, NULL);

PBYTE pBitmapBits;
HBITMAP handleBitmap;

handleBitmap = CreateDIBSection(hDC,
pBitmapInfo, DIB_RGB_COLORS,
(PVOID*)&pBitmapBits, NULL, 0);

LPBYTE lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pBitmapInfo->bmiHeader.biSizeImage);
GetDIBits(hDC, handleBitmap, 0, (WORD)pBitmapInfo->bmiHeader.biHeight, lpBits, pBitmapInfo, DIB_RGB_COLORS);

if ( (handleBitmap != NULL) && (pBitmapBits != NULL) )
{
//Coloca el puntero al inicio del archivo
SetFilePointer(hFile, bmfHeader.bfOffBits, NULL, FILE_BEGIN);
//Aquí se lee el archivo y se copian los bytes
//en pCBmpBits

bool bOk = ReadFile(hFile, pBitmapBits,
pBitmapInfo->bmiHeader.biSizeImage, &dwBytesRead, NULL);
if (bOk)
{
return true;
}
}
}
}


-Seguramente habrá muchas cosas mal , espero vuestra ayuda para sacar la matriz RGB y como leerla, para hacer comparaciones entre dos mapas de bits.
  #2 (permalink)  
Antiguo 01/05/2013, 10:02
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Bitmaps bit a bit

Creo que antes de entrar en algoritmos de colisiones deberias controlar un poco el flujo de datos para aplicaciones gui win32; lo de los pixels no le he mirado (pero puedes encontrar mas informacion en cualuier manual de 'per pixel collision').

Te comento solo lo que afecta a la aplicacion: no se recomienda abrir y cerrar un archivo en cada bucle, y menos abrir-cargar datos-etc en cada bucle para un videojuego. El archivo de imagen lo puedes compilar como recurso de la aplicacion, en la carga del videojuego lo cargas como global (y al final lo liberas), y si ya sabes que esa imagen no variará pues ya puedes extraer todo lo que quieras en el momento de la carga, pero no dentro del ciclo. Ademas dentro de la funcion 'bitmap(HDC )' estas bloquenado memoria con GlobalAlloc que luego no liberas.

Corrige todo esto antes de seguir, si tienes la aplicacion mal los algoritmos de colision no te serviran de nada.

Saludos
vosk

Etiquetas: funcion, int, struct, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:54.