2014-04-26 4 views
0

GetDIBits을 사용하여 C++에서 비트 맵을로드하려고합니다. 여기에 내가 사용하고 코드입니다 :GetDI 비트를 사용하여 비트 맵로드

HBITMAP hBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(id)); 

BITMAP BM; 
GetObject(hBmp, sizeof(BM), &BM); 

GLvoid* bits = NULL; 

BITMAPINFO bitmap_info; 
     memset(&bitmap_info, 0, sizeof(bitmap_info)); 
     bitmap_info.bmiHeader.biSize = sizeof(bitmap_info.bmiHeader); 
     bitmap_info.bmiHeader.biWidth = BM.bmWidth; 
     bitmap_info.bmiHeader.biHeight = BM.bmHeight; 
     bitmap_info.bmiHeader.biPlanes = 1; 
     bitmap_info.bmiHeader.biBitCount = DM_BITSPERPEL;//bits per pixel 
     bitmap_info.bmiHeader.biCompression = BI_RGB; 

GetDIBits(device_context, 
      hBmp, 
      0, BM.bmWidth, 
      bits, 
      &bitmap_info, 
      DIB_RGB_COLORS); 

그러나 bits 어떤 이유로 NULL 것 같다. 내 코드에 문제가 있습니까? 전에 GetBitmapBits을 사용했습니다. bitsNULL이 아닙니다.

+1

반환 값은 무엇입니까? –

+0

오류 매크로 나 NULL이 아닙니다. – user3075425

답변

3

가 발생하는 문제가 정확히 정의 :

lpvBits [출력]

비트 맵 데이터를 수신 버퍼에 대한 포인터. 이 매개 변수가 NULL이면이 함수는 비트 맵의 ​​크기와 형식을 으로 전달하고 lpbi 매개 변수가 가리키는 BITMAPINFO 구조체를 전달합니다.

(출처 : MSDN)

는 당신이 GetDIBits()이 비트를 입력 할 경우 비 제로 포인터를 제공해야, 요약하면. 필요한 메모리를 할당하는 것은 귀하의 책임입니다.

+0

'GLvoid * bits = malloc (BM.bmWidth * BM.bmHeight * sizeof (DWORD));'을 사용하여 fixxed했지만 이제는 GetDIBits가 0을 반환합니다. – user3075425

+0

@ user3075425 잘못 될 수있는 부분이 많이 있으며 추가 코드없이 쉽게 말할 수 없습니다. 한가지 옳지 않은 것은 주사선 수 ('GetDIBits()'의 네 번째 매개 변수)이며 'BM.bmHeight'여야합니다. 'LoadBitmap()'과'GetObject()'가 성공했는지 확인하고'device_context'가 유효한지 확인하십시오. 'GetDIBits()'는 수동으로하는 대신 빈 포인터를 먼저 호출함으로써'BITMAPINFO' 구조체를 채울 수 있습니다. – ph4nt0m

+0

'LoadBitmap' 성공 여부를 확인하는 가장 좋은 방법은 무엇입니까? 그리고 당신은'GetObject()'로 무엇을 설명 할 수 있습니까? 내 코드에서이 함수를 사용하지 않았습니다. – user3075425