2011-12-21 45 views
0

背景錯誤的原因是:我使用OpenCV2庫在我的MFC應用程序和的SetDIBitsToDevice顯示每個圖像。我的問題是,下面的代碼適用於90%的圖像文件,但不適用於某些旋轉的圖像,因爲我不知道。 Whole description of the issue is here我怎樣才能找到時的SetDIBitsToDevice返回錯誤代碼(0)

所以我需要找出爲什麼函數返回0錯誤代碼的圖像和我從函數得到什麼錯誤。

根據MSDN

如果零掃描線被設定(例如,當dwHeight是0)或 函數失敗,則該函數返回零。

所以,如果函數返回零,我怎麼才能找到錯誤的細節?

更新:我試圖使用GetLastError()如下。但實際上,消息是「操作成功完成」,當然這不是真的。我希望有任何提示或建議來解決這個問題。

BITMAPINFO* bmi = (BITMAPINFO*)buffer; 
FillBitmapInfo(bmi,width,height,Bpp(pDoc->m_cvImage),0); 
int result = SetDIBitsToDevice(pDC->GetSafeHdc(), 100, 100, width, 
    height, 0, 0, 0, height, pDoc->m_cvImage.data, bmi, 
    DIB_RGB_COLORS); 
if(result==0) { 
    DWORD error = GetLastError(); 
    LPVOID lpMsgBuf; 
    FormatMessage( 
     FORMAT_MESSAGE_ALLOCATE_BUFFER | 
     FORMAT_MESSAGE_FROM_SYSTEM | 
     FORMAT_MESSAGE_IGNORE_INSERTS, 
     NULL, 
     error, 
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
     (LPTSTR) &lpMsgBuf, 
     0, 
     NULL 
    ); 
    CString text; 
    // Process any inserts in lpMsgBuf. 
    text= (LPCTSTR)lpMsgBuf; 
    // Free the buffer. 
    LocalFree(lpMsgBuf);  
    int nResult = AfxMessageBox(text, MB_OK); 

} 
+1

使用GetLastError()。 – 2011-12-21 17:51:09

+0

@HansPassant謝謝。有趣的是,當我使用FormatMessage將函數中的值轉換爲字符串消息時,我得到了「操作成功完成」,這是不正確的。 – 2011-12-21 18:09:40

+0

一個常見的錯誤是調用其他一些獲取錯誤代碼的winapi函數。立即調用並將返回值存儲在局部變量中。 – 2011-12-21 18:11:24

回答

1

大部分的GDI函數不使用GetLastError()(一些事情,比如BitBlt())和GDI沒有定義等它自己的錯誤代碼比0GDI_ERROR。如果發生故障,通常無法確定實際的錯誤是什麼。你只需要用細齒梳子來查看你的代碼來尋找邏輯錯誤。

由於您在旋轉圖像時遇到了問題,因此我會先看看它們。它們的尺寸可能與您期望的尺寸不同,因此它們與您傳遞給SetDIBitsToDevice()的參數不匹配。

+0

當我將圖像製作成灰色級別時,它會以一種奇怪的方式顯示出來。我懷疑行和列混亂,但即使我交換寬度和高度,它根本不顯示原始圖像。這裏是[問題的完整說明](http://stackoverflow.com/questions/8546815/some-opencv-mat-of-rotated-images-do-not-display-on-mfc-view)萬一你是感興趣。 – 2011-12-21 19:16:55

1

如果您打算在API失敗時調用GetLastError,則會將其記錄下來。由於文檔沒有提到GetLastError,因此在發生超出返回值編碼信息範圍內的故障時沒有提供進一步的信息。

如果函數成功,則返回值是 設置的掃描行數。

如果設置了零掃描行(例如當dwHeight爲0)或者函數失敗,函數返回零。

如果驅動程序無法支持傳遞給SetDIBitsToDevice的JPEG或PNG文件圖像,則該函數將失敗並返回GDI_ERROR。如果發生故障,應用程序必須回退自己的JPEG或PNG支持以將圖像解壓縮爲位圖,然後將位圖傳遞給SetDIBitsToDevice。

恐怕你看起來像你自己在這裏。

+0

是的,它似乎是這樣。你能提出任何方法來解決這個問題嗎? – 2011-12-21 18:58:51

+0

我認爲我會通過搜索一些常見的失敗圖片來攻擊這個問題 – 2011-12-21 19:05:24

+0

我的MSDN庫的副本說它有。我們之前已經討論過這個問題,不知道發生了什麼。 – 2011-12-21 19:05:44