2011-07-05 3 views
-2

글쎄, 내가 png 파일로 저장하고 싶은 비트 맵 파일의 투명성에 대한 질문이있다. 순간 나는 시스템의 커서 스크린 샷을 찍어 png로 저장한다. 잘 부엉 화살표, 손 및 기타 커서를 사용하지만 순간 I-beam 또는 "not"커서와 같은 커서를 사용하는 순간 문제가 발생합니다. 설명은 각 커서에 마스크와 색상 비트 맵이 결합되어 투명하게됩니다. 커서하지만 나 - 빔 및 다른 사람이 비트 맵을 가지고, 그들은 동일한 비트 맵에 색상과 마스크를 포함하는 마스크를 가지고, 나는이 게시물을 참조하십시오 : C# - Capturing the Mouse cursor image 잘 그들은 C#을 사용하지만 아이디어는 동일합니다.흰색 바탕에 투명도 비트 맵 C++ winapi

내 코드에서 나는 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; 
    } 
+0

아니요, 아이디어는 분명히 ** 동일하지 않습니다 **. 복사하려고하는 C# 코드는 GDI +를 래핑 할뿐만 아니라 프로그래머를위한 편리하고 재사용 가능한 코드 라이브러리 호스트를 제공하는 .NET Framework를 사용하여 작성됩니다. 해당 라이브러리가 아직 작성되지 않았기 때문에 비 관리 C++을 작성할 때 모든 작업을 직접 수행해야합니다. 단순히 C# 코드를 C++ 코드로 변환 할 수는 없지만 언어 문제는 아니며 라이브러리 문제입니다. 'MakeTransparent()'함수는 찾을 수 없습니다. –

+0

감사합니다 코디 내가 조사하고 당신 말이 맞아,하지만 어떻게 투명 비트 맵을 흰색 배경 가진 비트 맵을 변환합니까?, 내가 제안하는 BitBlt 사용하고 SRCAND 및 SRCPAINT 작업을 수행 할 수 있지만 작동하지 않습니다. 검은 이미지 또는 흰색 이미지가있어, 나는 투명성을 만들기 위해 I-beam 마스크를 사용하는 방법을 모르겠다./ –

답변

-1

GDIPlus를 사용하십시오. 그것은 알파와 함께 올바로 작동합니다. Gdi는 언젠가 알파와 함께 올바로 작동하지 않습니다.

+0

안녕하세요, gdi를 사용하지 않았습니다. jpeglib가 들어있는 CxImage를 사용하면 아주 훌륭하고 간단하지만 문제는 라이브러리에서 아닙니다 나는 추측 할 수있는 논리에서 더 많은 것, 나는 그들이 함수 MakeTransparent (C#)를 단순히 사용하지만 C++에서는이 함수가 존재하지 않는다고 말합니다. –

+0

이 대답은별로 유용하지 않습니다. Asker가 C++ 응용 프로그램에서 GDI +를 사용하는 방법 *을 설명하지 않습니다. 그리고 그것은 또한 매우 모호합니다 : "Gdi는 언젠가 알파와 함께 올바르지 않습니다." 아닙니다. 그것은 설계된 그대로 작동합니다. 그것에 대해 무작위적인 것은 없으며 때로는 발생하지 않습니다. GDI의 한계를 설명하고 GDI +와 비교하는 것이 훨씬 더 유용 할 것입니다. –

+0

GDI +가 알파 블렌딩을 지원한다는 것을 의미합니다. "첫째, GDI +는 그라디언트 브러시 및 알파 블렌딩과 같은 새로운 기능을 제공함으로써 GDI의 기능을 확장합니다." (http://msdn.microsoft.com/en-us/library/ms536338(VS.85).aspx). GDI +를 사용하는 샘플이 없지만 인터넷에는 많은 샘플이 포함되어 있습니다. 나쁜 대답은 아무 것도없는 것보다 낫다고 생각합니다. – Unick