Вопрос

Я хочу создать функцию культуры в существующем двигателе. Это то, что у меня уже есть:

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 от растрового изображения класса.

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

Это было полезно?

Решение

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

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

Другие советы

Спасибо за помощь. Функция работает отлично сейчас.

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;
}

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

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); 

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top