Функция кадрирования BitBlt (...) - PullRequest
2 голосов
/ 08 сентября 2010

Я хочу создать функцию обрезки в существующем движке. Вот что у меня уже есть:

bool Bitmap::Crop(RECT cropArea)
{
BITMAP bm;
GetObject(m_Handle, sizeof(bm), &bm);

HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hNew, bm.bmWidth, bm.bmHeight);
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

BitBlt(hNew, 0, 0, bm.bmWidth, bm.bmHeight, hSrc, 0, 0, SRCCOPY);

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;
}

Я хочу, чтобы он просто скопировал все изображение в новый HBITMAP и заменил его старым. Так что я знаю, что это работает. После этого он просто играет с параметрами BitBlt.

m_Handle - это HBITMAP класса Bitmap.

Результатом этого кода является просто черный экран.

Ответы [ 3 ]

3 голосов
/ 08 сентября 2010

Никогда не создавайте совместимое растровое изображение из «свежего» DC памяти. Если только вы не ХОТИТЕ создать растровое изображение 1bpp - растровое изображение по умолчанию, выбранное в новом DC памяти, является растровым изображением 1x1 1bpp - так что любое совместимое растровое изображение, которое вы создадите, будет соответствовать этому. Который имеет тенденцию приводить к всему черному выводу.

Ваше цветное растровое изображение в hSrc, поэтому используйте , что dc, чтобы создать новое растровое изображение.

3 голосов
/ 09 сентября 2010

Спасибо, что помогли мне.Теперь функция работает отлично.

bool Bitmap::Crop(RECT cropArea)
{
HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(hSrc);
HBITMAP hBmp = CreateCompatibleBitmap(hSrc, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

bool retVal = (BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY))?true:false;

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;

return retVal;
}
2 голосов
/ 08 сентября 2010

Два небольших изменения:

HBITMAP hBmp = CreateCompatibleBitmap(hNew, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 

BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY); 

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

...