2010-09-08 2 views
2

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

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

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

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

2

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

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

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

+0

Хм, не работает. Я думаю, что это имеет какое-то отношение к моему созданию HDC. – Kazoeja

+0

Создание DC выглядит хорошо для меня. Вы должны проверить возвращаемые значения всего, особенно 'SelectObject'. –

+0

Что должно быть «hNew»? – Acidic

3

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

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

на строке 'bool retVal = (BoolBlt (...))? True: false;', его можно сократить до 'bool retVal = BoolBlt (...);' – Acidic