C++ MFC如何将具有透明属性的PNG转换为HBITMAP
我使用GDI+加载了C++ MFC如何将具有透明属性的PNG转换为HBITMAP,c++,winapi,visual-studio-2008,mfc,C++,Winapi,Visual Studio 2008,Mfc,我使用GDI+加载了PNG文件 我的源代码使用HBITMAP,因此我将PNG转换为HBITMAP PNG文件具有透明背景,但HBITMAP具有背景 我想从HBITMAP中删除回传。我没有足够的信息。这是我加载透明PNG文件的方式: // Based on afxbutton.cpp's static function ButtonLoadBitmap HBITMAP __stdcall CMeetingScheduleAssistantApp::ButtonLoadBitmap(UINT uiB
PNG
文件
我的源代码使用HBITMAP
,因此我将PNG
转换为HBITMAP
PNG
文件具有透明背景,但HBITMAP
具有背景
我想从
HBITMAP
中删除回传。我没有足够的信息。这是我加载透明PNG文件的方式:
// Based on afxbutton.cpp's static function ButtonLoadBitmap
HBITMAP __stdcall CMeetingScheduleAssistantApp::ButtonLoadBitmap(UINT uiBmpResId)
{
if (uiBmpResId == 0)
{
return nullptr;
}
LPCTSTR lpszResourceName = MAKEINTRESOURCE(uiBmpResId);
ENSURE(lpszResourceName != nullptr);
HBITMAP hbmp = nullptr;
// Try to load PNG image first:
CPngImage pngImage;
if (pngImage.Load(lpszResourceName))
{
hbmp = (HBITMAP)pngImage.Detach();
}
else
{
HINSTANCE hinstRes = AfxFindResourceHandle(lpszResourceName, RT_BITMAP);
if (hinstRes == nullptr)
{
return nullptr;
}
UINT uiLoadImageFlags = LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS;
hbmp = (HBITMAP) ::LoadImage(hinstRes, lpszResourceName, IMAGE_BITMAP, 0, 0, uiLoadImageFlags);
}
return hbmp;
}
我的代码设计用于加载资源,但您可以调整它以使用外部文件。您是否查看了
CImage
类:?@andrewruckle我尝试了CImage::TransparentBlt
,但我希望转换到HBITMAP
,背景透明,因此您不能像这里一样加载它:?CImage
类具有透明性。您应该能够显示透明图像。其他人可能会对您提供更多帮助,但我认为您可能需要提供更多的上下文和一些您当前正在做的事情的示例代码。加上当前结果的示例。CImage
类实现,因此您可以轻松地将CImage
传递到任何需要HBITMAP
的地方。请注意,alpha透明度不是与HBITMAP
一起存储的属性。根据您使用的API(例如vs),暗示使用alpha通道。它是什么类型的PNG文件?有两种,8位调色板带有透明颜色(如GIF),32位调色板带有alpha透明。您的PNG
图像在不使用GDI+
的情况下清晰可见?我的PNG
图像带有alpha通道,因此当我使用您的代码时,加载的图像是32位的image@Davidseong首先调用CPngImage。它迎合了透明图像。