【问题标题】:MFC how to convert PNG with transparent attribute to HBITMAPMFC如何将具有透明属性的PNG转换为HBITMAP
【发布时间】:2018-08-05 18:35:55
【问题描述】:

我使用 GDI+ 加载了PNG 文件。

我的来源使用HBITMAP,所以我将PNG 转换为HBITMAP

PNG 文件具有透明背景,但 HBITMAP 具有背景。

我想从HBITMAP 中删除背景。

【问题讨论】:

  • @AndrewTruckle 我试过CImage::TransparentBlt,但我想用透明背景转换成HBITMAP
  • 所以你不能只加载它,就像这里:stackoverflow.com/questions/2490661/…CImage 类具有透明度。您应该能够显示透明图像。其他人可能可以为您提供更多帮助,但我认为您可能必须提供更多上下文和一些您当前正在做的事情的示例代码。加上当前结果的示例。
  • CImage 类实现了operator HBITMAP,因此您可以在任何需要HBITMAP 的地方轻松传递CImage。请注意,alpha 透明度不是使用HBITMAP 存储的属性。根据您使用的 API(例如 AlphaBlendStretchBlt),隐含 alpha 通道。
  • 是什么样的PNG文件?有两种,8 位透明色(如 GIF)和 32 位 alpha 透明色。

标签: c++ winapi visual-studio-2008 mfc


【解决方案1】:

我真的没有足够的信息。这就是我加载透明 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;
}

我的代码旨在加载资源,但您可以对其进行调整以使用外部文件。

【讨论】:

  • 您的PNG 图像在不使用GDI+ 的情况下干净利落?
  • 我的PNG 图像是 32 位的,带有 alpha 通道,所以当我使用你的代码时,加载了损坏的图像
  • @Davidseong CPngImage 首先被调用。这适合透明图像。
猜你喜欢
  • 2012-12-04
  • 2018-06-05
  • 1970-01-01
  • 2012-06-26
  • 2015-01-26
  • 2016-04-30
  • 2012-01-29
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多