1

マウス カーソルからビットマップを取得しようとしていますが、次のコードでは色を取得できません。

CURSORINFO cursorInfo = { 0 };
cursorInfo.cbSize = sizeof(cursorInfo);

if (GetCursorInfo(&cursorInfo))  {

    ICONINFO ii = {0};
    int p = GetIconInfo(cursorInfo.hCursor, &ii);

    // get screen
    HDC dc = GetDC(NULL);
    HDC memDC = CreateCompatibleDC(dc);
    //SelectObject(memDC, ii.hbmColor);

    int counter = 0;

    //
    byte* bits[1000];// = new byte[w * 4]; 
    BITMAPINFO bmi;
    memset(&bmi, 0, sizeof(BITMAPINFO)); 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = 16;
    bmi.bmiHeader.biHeight = 16;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage     = 0;
    bmi.bmiHeader.biXPelsPerMeter = 0;
    bmi.bmiHeader.biYPelsPerMeter = 0;
    bmi.bmiHeader.biClrUsed       = 0;
    bmi.bmiHeader.biClrImportant  = 0;
    int rv = ::GetDIBits(memDC, ii.hbmColor, 0, 1, (void**)&bits, &bmi, DIB_RGB_COLORS);
}
4

2 に答える 2

1

Windows によって記録されたビットマップのパラメーターを取得することから始めます。

BITMAP bitmap = {0};
GetObject(ii.hbmColor, sizeof(bitmap), &bitmap);

返された値を使用して、bmi構造体に入力できます。

bmi構造について: はパレットに十分なスペースを確保BITMAPINFOしていません。これには独自の構造を作成する必要があります。

struct BitmapPlusPalette
{
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD palette[256];
};

ビットマップに必要なバイト数の計算は、切り上げる必要があるため、少し注意が必要です。

w = ((bitmap.bmWidth * bitmap.bmBitsPixel) + 31) / 8;
byte* bits = new byte[w * bitmap.bmHeight];

そして、これが最終行の修正版です。

int rv = ::GetDIBits(dc, ii.hbmColor, 0, bitmap.bmHeight, bits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS);
于 2011-06-16T15:10:57.450 に答える
0

あなたのコードの問題は、「ビット」変数にメモリを割り当てた方法と、それを GetDIBits 関数で使用した方法にあると思います。

まずコメント部分のbyte* bits = new byte[w*4]方が良かったですbyte* bits[1000]。あなたが書くとき、byte* bits[1000]コンピュータは1000 POINTERSをバイトに割り当てます。これらのポインターはそれぞれ、何も指していません。

次に、GetDIBits は LPVOID lpvBits を 5 番目のパラメーターとして受け入れます。つまり、void へのポインターです。ほとんどのプラットフォームでは sizeof(void *) > sizeof(byte) なので、単にバイト配列を渡すことはできません。おそらく int または unsigned int へのポインターを渡す方がよいでしょう (私は Windows の型が苦手なので、だから多分もっと適切なものが良いはずです、ごめんなさい)。

だから、私の推測はこれです:

unsigned bits[1000];
memset(bits, 0, sizeof(bits));
//...
int tv = GetDIBits(memDC, ii.hmbColor, 0, 1, (LPVOID)bits, /* ... */);
于 2011-06-16T12:57:25.690 に答える