2010-09-08 14 views
2

Je souhaite créer une fonction de recadrage dans un moteur existant. Voilà ce que je l'ai déjà:Fonction Crop 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; 
} 

Je veux simplement copier l'image entière à un nouveau HBITMAP et remplacer l'ancien avec elle. Donc je sais que ça fonctionne. Après cela, il joue juste avec les paramètres BitBlt.

m_Handle est un HBITMAP de la classe Bitmap.

Le résultat de ce code est juste un écran noir.

Répondre

3

Ne créez jamais un bitmap compatible à partir d'une mémoire CC «fraîche». Sauf si vous voulez créer un bitmap 1bpp - le bitmap par défaut sélectionné dans une nouvelle mémoire DC est un bitmap 1x1 1bpp - donc tout bitmap compatible que vous créez correspondra à cela. Ce qui tend à entraîner toute la sortie noire.

Votre bitmap couleur est en hSrc, donc utilisez que dc pour créer le nouveau bitmap.

2

Deux petits changements:

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

Vous voudrez peut-être un peu plus de vérifier pour assurer que la zone demandée relève de la taille du bitmap d'origine.

+0

Hmm, ne fonctionne pas. Je pense que cela a quelque chose à voir avec ma création des HDC. – Kazoeja

+0

La création de DC semble OK pour moi. Vous devriez vérifier les valeurs de retour de tout, en particulier le 'SelectObject's. –

+0

Que devrait être 'hNew'? – Acidic

3

Merci de votre aide. La fonction fonctionne parfaitement maintenant.

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

sur la ligne 'bool retVal = (BoolBlt (...))? True: false;', il peut être raccourci à 'bool retVal = BoolBlt (...);' – Acidic