Как я могу найти причину ошибки, когда SetDIBitsToDevice возвращает код ошибки (0) - PullRequest
0 голосов
/ 21 декабря 2011

Фон: Я использую библиотеку OpenCV2 в своем приложении MFC и SetDIBitsToDevice для отображения каждого изображения. Моя проблема в том, что следующий код работает с 90% файлов изображений, но не работает с определенными повернутыми изображениями по причине, которую я не знаю. Полное описание проблемы здесь

Итак, мне нужно выяснить, почему функция возвращает 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);

}

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Если вы собираетесь вызывать GetLastError в случае сбоя API, это будет задокументировано. Поскольку в документации не упоминается GetLastError, представляется, что в случае сбоя дополнительная информация не предоставляется, кроме информации, закодированной в возвращаемом значении.

Если функция завершается успешно, возвращаемое значение является числом набор строк развертки.

Если установлены нулевые линии сканирования (например, когда dwHeight равен 0) или функция не работает, функция возвращает ноль.

Если драйвер не может поддерживать изображение в формате JPEG или PNG, переданное в SetDIBitsToDevice, функция завершится ошибкой и вернет GDI_ ERROR. Если сбой происходит, приложение должно использовать собственную поддержку JPEG или PNG, чтобы распаковать изображение в растровое изображение, а затем передать растровое изображение в SetDIBitsToDevice.

Боюсь, похоже, ты здесь сам по себе.

1 голос
/ 21 декабря 2011

Большинство функций GDI не используют GetLastError() (некоторые используют, например, BitBlt()), и GDI не определяет свои собственные коды ошибок, кроме 0 и GDI_ERROR.Если происходит сбой, обычно не существует способа определить, что является фактической ошибкой.Вы просто должны просмотреть свой код с помощью мелкой зубной щетки в поисках логических ошибок.

Поскольку у вас возникают проблемы с повернутыми изображениями, я бы сначала начал с их просмотра.Они, вероятно, не имеют тех размеров, которые вы ожидаете, поэтому они не соответствуют параметрам, которые вы передаете SetDIBitsToDevice().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...