2014-01-05 2 views
0

Существует HBITMAP, который может быть успешно отображен. Я хочу получить часть (заданную rect) растрового изображения, так что это следующий код, но возвращаемое растровое изображение всегда черное. Что-то не так с кодом? Благодарю.Получите указанную часть hbitmap.

HBITMAP GetSelectedBitmap(HBITMAP p_bitmap, int x, int y, int width, int height){ 

    HDC l_srcDc = ::CreateCompatibleDC(NULL); 
    ::SelectObject(l_srcDc, p_bitmap); 

    HDC l_dstDc = ::CreateCompatibleDC(l_srcDc); 

    HBITMAP l_newBitmap = CreateCompatibleBitmap(l_dstDc, width, height); 
    HBITMAP l_oldBitmap = (HBITMAP)::SelectObject(l_dstDc, l_newBitmap); 
    ASSERT(0 != ::BitBlt(l_dstDc, 0, 0, width, height, l_srcDc, x, y, SRCCOPY)); 
    HBITMAP l_clippedBitmap = (HBITMAP)::SelectObject(l_dstDc, l_oldBitmap); 
    ::DeleteDC(l_srcDc); 
    ::DeleteDC(l_dstDc); 
    return l_clippedBitmap;} 
+1

Является ли исходное растровое изображение DDB или DIB? Возвращает ли 'SelectObject()' NULL при выборе растрового изображения в исходный HDC? Вы также не сохраняете и не восстанавливаете исходное растровое изображение исходного HDC, прежде чем уничтожить HDC. –

+1

Размещение 'BitBlt' внутри макроса' ASSERT' будет компилироваться в no-op в выпуске сборки. – IInspectable

ответ

0

Я нашел причину, изменить

HBITMAP l_newBitmap = CreateCompatibleBitmap(l_dstDc, width, height); 

в

HBITMAP l_newBitmap = CreateCompatibleBitmap(l_srcDc, width, height); 

решить проблему. это означает, что CreateCompatibleBitmap должен использовать источник постоянного тока.

+0

Проблема другая: ['CreateCompatibleDC'] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd183489.aspx) создает память DC, чья *" поверхность отображения точно один ** монохромный ** пиксель в ширину и один монохромный пиксель высотой ». * Создание совместимого растрового изображения создаст ** монохромное ** растровое изображение. Ваше решение работает, поскольку вы выбираете подходящий (цветной) битмап в свой 'l_srcDC', до вызова' CreateCompatibleBitmap'. – IInspectable

Смежные вопросы