Pregunta

Quiero crear una función de recorte en un motor existente. Esto es lo que ya tengo:

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

quiero que acaba de copiar toda la imagen a una nueva HBITMAP y reemplazar el viejo con él. Así que sé que funciona. Después de que es sólo jugar con los parámetros BitBlt.

m_Handle es un HBITMAP del mapa de bits de clase.

El resultado de este código es sólo una pantalla en negro.

¿Fue útil?

Solución

Nunca crear un mapa de bits compatibles de una memoria 'fresco' de CC. A menos que se desea crear un mapa de bits 1bpp - el mapa de bits por defecto seleccionado en una nueva memoria DC es un mapa de bits 1x1 1bpp - por lo que cualquier mapa de bits compatibles crear coincidirá con eso. El cual tiende a resultar en todas las salidas de negro.

Su color de mapa de bits en en HSRC, por lo que el uso de que de corriente continua para que el nuevo mapa de bits.

Otros consejos

Gracias por ayudarme. La función funciona perfectamente ahora.

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

Dos pequeños cambios:

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

Es posible que desee un poco más la comprobación para asegurarse de que el área solicitada se inscribe en el tamaño del mapa de bits original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top