Прозрачность на белом фоне растрового изображения C ++ winapi - PullRequest
0 голосов
/ 05 июля 2011

Ну, у меня есть вопрос о прозрачности в растровом файле, который я хочу сохранить в виде png-файла, на данный момент я делаю снимок курсора в системе и сохраняю его как png, это отлично работает со стрелкой, рукой идругие курсоры, но в момент использования курсоров, таких как I-beam или «not» курсор, возникает проблема, объяснение состоит в том, что каждый курсор имеет маску и цветное растровое изображение, которые комбинируются и приводят к прозрачному курсору, но I-beam и другиене имеют цветного растрового изображения, у них есть только маска, содержащая цвет и маску в одном растровом изображении, я ссылаюсь на этот пост: C # - захват изображения курсора мыши хорошо, они используют C #, но идея та же.

в моем коде я использую C ++ и мне удается создать курсор, но с белым фоновым цветом, я не знаю, как преобразовать его в прозрачный цвет, в сообщении, которое я имею в виду, использовать функцию MakeTransparent, вы понимаете?спасибо за помощь: D

    CURSORINFO cursor;
    ICONINFO cursorIconInfo;
    HICON cursorIcon;
    cursor.cbSize=sizeof(CURSORINFO);
    GetCursorInfo(&cursor);
    GetIconInfo(cursor.hCursor,&cursorIconInfo);
    //cursorIcon=CopyIcon(cursor.hCursor);
    //GetIconInfo(LoadCursor(NULL,IDC_ARROW),&cursorIconInfo);
    //cursorIcon=CreateIconIndirect(&cursorIconInfo);

    CxImage* imag=new CxImage();
    /*imag->CreateFromHICON(cursorIcon);
    imag->Save("cursor.png",CXIMAGE_FORMAT_PNG);*/
    BITMAP bm;
    //CImage* imag=new CImage();
    GetObject(cursorIconInfo.hbmMask,sizeof(BITMAP),&bm);
    if(bm.bmHeight == bm.bmWidth*2){
        HDC screendc=CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
        HDC cursormaskDC=CreateCompatibleDC(screendc);
        HDC cursorfinalDC=CreateCompatibleDC(screendc);

        HBITMAP cursormask=CreateCompatibleBitmap(screendc,bm.bmWidth,bm.bmWidth);
        HBITMAP cursorfinal=CreateCompatibleBitmap(screendc,bm.bmWidth,bm.bmWidth);

        SelectObject(cursormaskDC,cursorIconInfo.hbmMask);
        SelectObject(cursorfinalDC,cursorfinal);

        BitBlt(cursorfinalDC,0,0,bm.bmWidth,bm.bmWidth,cursormaskDC,0,bm.bmWidth,SRCCOPY); 
        BitBlt(cursorfinalDC,0,0,bm.bmWidth,bm.bmWidth,cursormaskDC,0,0,SRCINVERT);

        /*cursorIconInfo.hbmColor=cursorcolor;
        cursorIconInfo.hbmMask=cursormask;
        cursorIcon=CreateIconIndirect(&cursorIconInfo);
        imag->CreateFromHICON(cursorIcon);
        imag->Save("cursorPrub.png",CXIMAGE_FORMAT_PNG);*/
        imag->CreateFromHBITMAP(cursorfinal);

        imag->Save("cursor.png",CXIMAGE_FORMAT_PNG);
        DeleteObject(cursorIconInfo.hbmMask);
        DeleteObject(cursorIconInfo.hbmColor);
        DestroyIcon(cursorIcon);

        imag->Destroy();
        return;
    }

1 Ответ

0 голосов
/ 05 июля 2011

Используйте GDIPlus.Это работает правильно с альфа.GDI иногда некорректно работает с альфой.

...