글쎄, 내가 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;
}
아니요, 아이디어는 분명히 ** 동일하지 않습니다 **. 복사하려고하는 C# 코드는 GDI +를 래핑 할뿐만 아니라 프로그래머를위한 편리하고 재사용 가능한 코드 라이브러리 호스트를 제공하는 .NET Framework를 사용하여 작성됩니다. 해당 라이브러리가 아직 작성되지 않았기 때문에 비 관리 C++을 작성할 때 모든 작업을 직접 수행해야합니다. 단순히 C# 코드를 C++ 코드로 변환 할 수는 없지만 언어 문제는 아니며 라이브러리 문제입니다. 'MakeTransparent()'함수는 찾을 수 없습니다. –
감사합니다 코디 내가 조사하고 당신 말이 맞아,하지만 어떻게 투명 비트 맵을 흰색 배경 가진 비트 맵을 변환합니까?, 내가 제안하는 BitBlt 사용하고 SRCAND 및 SRCPAINT 작업을 수행 할 수 있지만 작동하지 않습니다. 검은 이미지 또는 흰색 이미지가있어, 나는 투명성을 만들기 위해 I-beam 마스크를 사용하는 방법을 모르겠다./ –