2013-06-07 1 views
3

먼저 "cool.bmp"이미지를로드합니다.로드가 정상입니다. 그럼 "getPixArray"함수를 호출하지만 실패합니다.C++ GetDIBits가 작동하지 않습니다.

case WM_CREATE:// runs once on creation of window 
      hBitmap = (HBITMAP)LoadImage(NULL, L"cool.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
      if(hBitmap == NULL) 
       ::printToDebugWindow("Error: loading bitmap\n"); 
      else 
       BYTE* b = ::getPixArray(hBitmap);  

내 getPixArray 기능

BYTE* getPixArray(HBITMAP hBitmap) 
     { 
     HDC hdc,hdcMem; 

     hdc = GetDC(NULL); 
     hdcMem = CreateCompatibleDC(hdc); 

     BITMAPINFO MyBMInfo = {0}; 
     // Get the BITMAPINFO structure from the bitmap 
     if(0 == GetDIBits(hdcMem, hBitmap, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS)) 
     { 
      ::printToDebugWindow("FAIL\n"); 
     } 

     // create the bitmap buffer 
     BYTE* lpPixels = new BYTE[MyBMInfo.bmiHeader.biSizeImage]; 

     MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader); 
     MyBMInfo.bmiHeader.biBitCount = 32; 
     MyBMInfo.bmiHeader.biCompression = BI_RGB; 
     MyBMInfo.bmiHeader.biHeight = (MyBMInfo.bmiHeader.biHeight < 0) ? (-MyBMInfo.bmiHeader.biHeight) : (MyBMInfo.bmiHeader.biHeight); 

     // get the actual bitmap buffer 
     if(0 == GetDIBits(hdc, hBitmap, 0, MyBMInfo.bmiHeader.biHeight, (LPVOID)lpPixels, &MyBMInfo, DIB_RGB_COLORS)) 
     { 
      ::printToDebugWindow("FAIL\n"); 
     } 

     return lpPixels; 
    } 

이 함수는 이미지의 묘화에 사용하는 내부 픽셀 어레이에 대한 레퍼런스를 얻을 예정이다. 둘 다 'FAIL'메시지가 콘솔에 출력됩니다. 누구든지 오류를 식별하거나이 함수의 작동 버전을 더 잘 생성하여 배울 수 있습니까? 이걸로 며칠 동안 붙어 있거든, 도와주세요! 이것은 내가 사용되는 이미지입니다 GetDIBits and loop through pixels using X, Y

:

이이었다 내가에서이 코드의 대부분을 얻은 것입니다 "cool.bmp"24 비트 비트 맵입니다. 너비 : 204 높이 : 204

+0

'GetLastError'를 확인 했습니까? – Lol4t0

+0

아니 어떻게 사용합니까? –

+0

GetDIBits의 MSDN 페이지에 "응용 프로그램에서이 함수를 호출 할 때 hbmp 매개 변수로 식별되는 비트 맵을 장치 컨텍스트로 선택하면 안됩니다." 당신은 그 제한을 어겼습니다. –

답변

5

MyBMInfo.bmiHeader.biSize을 초기화하지 않았으므로 첫 번째 함수 호출이 실패합니다. 이렇게해야합니다 :

... 
BITMAPINFO MyBMInfo = {0}; 
MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader); 
// Get the BITMAPINFO structure from the bitmap 
if(0 == GetDIBits(hdcMem, hBitmap, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS)) 
.... 

일단 수정하면 나머지 코드가 의도 한대로 작동합니다.

+0

!! 예, 그 것이 었습니다! –

+1

미리 채워야하는 "출력 매개 변수"가 훌륭하지 않습니까? 물론 좋은 이유가 있습니다. 'bmiHeader.biSize' 필드는 스키마 식별자로 사용되며 향후 Windows 버전에서 확장 된 구조를 인식하는 앱에 더 많은 정보를 반환 할 수있는 강력한 기능을 제공합니다.하지만 문서 어떤 필드를 미리 설정해야하는지 정확하게 말하지는 않습니다. –

관련 문제