2

既存のエンジンでクロップ機能を作成したいと考えています。これは私がすでに持っているものです:

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 はクラス Bitmap の HBITMAP です。

このコードの結果は、単なる黒い画面です。

4

3 に答える 3

4

私を助けてくれてありがとう。機能は完全に機能するようになりました。

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;
}
于 2010-09-08T21:20:26.427 に答える
3

「新しい」メモリ DC から互換性のあるビットマップを作成しないでください。1bpp ビットマップを作成したい場合を除き、新しいメモリ DC で選択されたデフォルトのビットマップは 1x1 1bpp ビットマップであるため、作成する互換性のあるビットマップはすべてそれに一致します。これは、すべて黒の出力になる傾向があります。

あなたのカラー ビットマップは hSrc にあるので、そのdc を使用して新しいビットマップを作成します。

于 2010-09-08T19:58:26.303 に答える
2

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

要求された領域が元のビットマップのサイズ内にあることを確認するために、もう少しチェックする必要があるかもしれません。

于 2010-09-08T19:05:54.927 に答える